2013-05-29 102 views
1

我有兩個CSV文件,一個有很長的參考號碼列表,另一個是每天的訂單列表。CSV操作AWK?

我每天都需要將&粘貼從日期訂單中刪除。很明顯,我只是裁剪了很多參考號碼,因此例如如果有20個訂單,我需要從另一個文件中獲得20個參考號碼並粘貼到我的訂單文件中。我減少了這些數字,以免在接下來的日子裏出現重複。

我想自動化這個過程,但我不知道最好的方法。我正在運行windows並使用AWK進行一些其他csv操作,但我對AWK並不是很有經驗,並且不確定這是否可行,所以我只是問是否有人有任何想法提供最佳解決方案。

+0

你能提供文件的摘錄嗎? – aymericbeaumet

+1

mvp給你一個很好的答案。除非你幸運,否則你必須自己編寫所有的CSV解析代碼。 Perl已經有了一個CSV庫,並且類似於AWK,你所擁有的任何awk技能都應該主要進行翻譯。如果您感到困惑,請使用a2p,這是一個隨perl一起提供的實用程序,可將awk轉換爲perl。 – JimR

+0

發佈一些示例輸入和預期輸出。這聽起來像你想要做的事情在awk中微不足道,但是如果我非常懷疑,你確實需要全面解析所有類型的CSV文件,那麼你可以從http://lorance.freeshell下載並使用Stinsons CSV解析器.ORG/CSV。 –

回答

2

正確解析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加入語句以同時正確連接來自兩個表的數據。

+0

非常感謝。 – Paul