如何合并相同格式的两个CSV记录

如何合并相同格式的两个CSV记录

两个CSV,格式一样。只是想把记录追加到其中一个文件中去。
1.csv
sn,日期,名字,兴趣
1,0420,coco,shopping

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

现在想到通过读入第二个文件,然后追加同时修改sn号。 有没有类似数据库追加的方式呢?如何操作??
谢谢!
用关联数组来做
DBD::CSV?
DBD::CSV
不知道该如何来用。 首先需要将csv导入生成一个table。那么,第一行怎么办?
我现在已经通过常规数组的方法可以合并。但总感觉对于csv这种格式化的数据,采用土办法不是很明智。


QUOTE:
原帖由 mantou 于 2008-4-26 21:50 发表
DBD::CSV
不知道该如何来用。 首先需要将csv导入生成一个table。那么,第一行怎么办?
我现在已经通过常规数组的方法可以合并。但总感觉对于csv这种格式化的数据,采用土办法不是很明智。



[Copy to clipboard] [ - ]
CODE:
use DBI;
use strict;
#my $table='employee';
my $dbh = DBI->connect("DBI:CSV:/dirContainedCSV") || die "$!\n";
eval{
    $dbh->{'csv_tables'}->{'tableOne'} = { 'file' => '1.csv'};
    $dbh->{'csv_tables'}->{'tableTwo'} = { 'file' => '2.csv'};
    my @combined=();
    push (@combined,@{$dbh->selectall_arrayref(q{SELECT * FROM tableOne})});
    push (@combined,@{$dbh->selectall_arrayref(q{SELECT * FROM tableTwo})});
    my $combinedTable='combinedTable.csv';
    my $sth=$dbh->prepare( qq{CREATE TABLE $combinedTable (
                    sn integer,
                    date CHAR(10),
                    name CHAR(10),
                    hobby CHAR(100)
                 )}
             );
    $sth->execute() or die "Cannot execute: " . $sth->errstr();
    $sth->finish();
    for(0..@combined-1){
        shift @{$combined[$_]};
        $dbh->do(
            qq{INSERT INTO $combinedTable values (?,?,?,?)},
            {},$_,@{$combined[$_]}
        );
    }
};
$dbh->disconnect;
die $@ if $@;

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

很感谢smonkey0 兄。
您的想法我有想过,但有一个问题就是,我要使得合并后的csv文件第一行为
sn,日期,名字,兴趣

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

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 ": $!";
  
while (my $row = $csv->getline ($fh))
  {
     
     if($table < 1)
     {
      $count++;
      print OUT join(',',@$row );
      print OUT "\n";
      }
      else{
          if( $$row[0] =~ /sn/)
          {
              next;
          }
          else{
              $$row[0]=$count+1;
              print OUT join(',',@$row );
          print OUT "\n";
        
          $count++;
          }
      }
  }
  close $fh;
}
print "\nALL Records: ".$count."\n";
close(OUT);