正確解析CSV是非常棘手的業務。大多數困難來自於解析內容中的引號,雙引號,逗號,空格等錯誤。
與其重新發明輪子,我會推薦使用一些經過良好測試的庫。我不認爲awk有一個,但Perl會:DBD::CSV
。
在Windows上,只需安裝ActivePerl,它已經默認安裝了DBD::CSV
。
然後,用Perl代碼來完成檢索數據並將其轉換爲其他格式裏面while
循環:
use DBI;
my $dbh = DBI->connect("dbi:CSV:f_ext=.csv") or die $DBI::errstr;
my $sth = $dbh->prepare("SELECT * FROM mytable"); # access mytable.csv
$sth->execute();
while (my @row = $sth->fetchrow_array()) {
print "id: $row[0], name: $row[1]\n";
}
# you can also access columns by name, like this:
# while (my $row = $sth->fetchrow_hashref()) {
# print "id: $row->{id}, name: $row->{name}\n";
# }
$sth->finish();
$dbh->disconnect();
既然你提到你有2個輸入CSV文件,您也許能甚至使用SQL加入語句以同時正確連接來自兩個表的數據。
來源
2013-05-29 09:22:01
mvp
你能提供文件的摘錄嗎? – aymericbeaumet
mvp給你一個很好的答案。除非你幸運,否則你必須自己編寫所有的CSV解析代碼。 Perl已經有了一個CSV庫,並且類似於AWK,你所擁有的任何awk技能都應該主要進行翻譯。如果您感到困惑,請使用a2p,這是一個隨perl一起提供的實用程序,可將awk轉換爲perl。 – JimR
發佈一些示例輸入和預期輸出。這聽起來像你想要做的事情在awk中微不足道,但是如果我非常懷疑,你確實需要全面解析所有類型的CSV文件,那麼你可以從http://lorance.freeshell下載並使用Stinsons CSV解析器.ORG/CSV。 –