免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7105 | 回复: 6
打印 上一主题 下一主题

如何合并相同格式的两个CSV记录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-26 13:13 |只看该作者 |倒序浏览
两个CSV,格式一样。只是想把记录追加到其中一个文件中去。
1.csv
sn,日期,名字,兴趣
1,0420,coco,shopping

2.csv
sn,日期,名字,兴趣
1,0421,doo,cpu
2,0322,lili,men

现在想到通过读入第二个文件,然后追加同时修改sn号。 有没有类似数据库追加的方式呢?如何操作??
谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-04-26 20:08 |只看该作者
用关联数组来做

论坛徽章:
0
3 [报告]
发表于 2008-04-26 21:08 |只看该作者
DBD::CSV?

论坛徽章:
0
4 [报告]
发表于 2008-04-26 21:50 |只看该作者
DBD::CSV
不知道该如何来用。 首先需要将csv导入生成一个table。那么,第一行怎么办?
我现在已经通过常规数组的方法可以合并。但总感觉对于csv这种格式化的数据,采用土办法不是很明智。

论坛徽章:
0
5 [报告]
发表于 2008-04-27 01:52 |只看该作者
原帖由 mantou 于 2008-4-26 21:50 发表
DBD::CSV
不知道该如何来用。 首先需要将csv导入生成一个table。那么,第一行怎么办?
我现在已经通过常规数组的方法可以合并。但总感觉对于csv这种格式化的数据,采用土办法不是很明智。
  1. use DBI;
  2. use strict;
  3. #my $table='employee';
  4. my $dbh = DBI->connect("DBI:CSV:/dirContainedCSV") || die "$!\n";
  5. eval{
  6.     $dbh->{'csv_tables'}->{'tableOne'} = { 'file' => '1.csv'};
  7.     $dbh->{'csv_tables'}->{'tableTwo'} = { 'file' => '2.csv'};
  8.     my @combined=();
  9.     push (@combined,@{$dbh->selectall_arrayref(q{SELECT * FROM tableOne})});
  10.     push (@combined,@{$dbh->selectall_arrayref(q{SELECT * FROM tableTwo})});
  11.     my $combinedTable='combinedTable.csv';
  12.     my $sth=$dbh->prepare( qq{CREATE TABLE $combinedTable (
  13.                     sn integer,
  14.                     date CHAR(10),
  15.                     name CHAR(10),
  16.                     hobby CHAR(100)
  17.                  )}
  18.              );
  19.     $sth->execute() or die "Cannot execute: " . $sth->errstr();
  20.     $sth->finish();
  21.     for(0..@combined-1){
  22.         shift @{$combined[$_]};
  23.         $dbh->do(
  24.             qq{INSERT INTO $combinedTable values (?,?,?,?)},
  25.             {},$_,@{$combined[$_]}
  26.         );
  27.     }
  28. };
  29. $dbh->disconnect;
  30. die $@ if $@;
复制代码


刚好最近在做数据库。如果有个文件数据量大的话,先count一个,然后再追加另一个就行,不多就合并数组好了。方便。

[ 本帖最后由 smonkey0 于 2008-4-27 10:38 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2008-04-28 10:18 |只看该作者
很感谢smonkey0 兄。
您的想法我有想过,但有一个问题就是,我要使得合并后的csv文件第一行为
sn,日期,名字,兴趣

然后才是合并后的一条条的记录。  对原有文件第一行中文列名如何处理,通过用DBI的方法我还没解决。目前我是通过Text::CSV_XS 结合逻辑,将第一行中文保留到新文件中,第2..n个文件修改其sn保证自增长,能解决问题。不过感觉有点土,csv也算是一种数据库当然希望通过数据库的方式,效率会高效,且逻辑会很清楚。

论坛徽章:
0
7 [报告]
发表于 2008-04-28 10:19 |只看该作者

use strict;
use warnings;
use Text::CSV_xs;

###### combine two csv records #######

my @files=<*.csv>;
my $count=-1;
open(OUT,">>end.csv");

foreach my $table(0..$#files)

{

my $csv = Text::CSV_XS->new ({ binary => 1 , blank_is_undef => 1});
open my $fh, "<", "$files[$table]" or die ": $!";
&nbsp;&nbsp;
while (my $row = $csv->getline ($fh))
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($table < 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$count++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print OUT join(',',@$row );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print OUT "\n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( $$row[0] =~ /sn/)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$$row[0]=$count+1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print OUT join(',',@$row );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print OUT "\n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$count++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
&nbsp;&nbsp;close $fh;
}
print "\nALL Records: ".$count."\n";
close(OUT);



[ 本帖最后由 mantou 于 2008-4-28 10:24 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP