2010-03-31 35 views
2

我們正在改變網上商店平臺,我們需要從不同來源導入產品數據。查詢:智能合併CSV文件

我們目前有來自不同系統/數據庫的幾個不同的csv文件,因爲每個系統都缺少一些信息。幸運的是,產品id相同,因此可以使用ID關聯數據。

我們需要將這些數據合併到一個大的csv文件中,以便我們可以導入到我們新的電子商務網站。

我的問題:當您需要將csv文件與相關數據合併到一個csv文件時,是否有一種通用方法?有沒有任何應用程序或工具可以幫助你?

+0

您可能會喜歡看看我的FOSS項目http://code.google.com/p/csvfix/,它也是一個可以處理這類事情的項目。 – 2010-03-31 14:38:13

回答

2

是的。使用Python和csv模塊。

閱讀,創建合併結果集,然後寫入。

import csv 

products = {} 
with open("one file.csv", "rb") as source: 
    rdr = csv.DictReader(source) 
    for row in rdr: 
     products[row['somekeycolumn']] = row # or maybe some rearrangement 

with open('another file.csv', 'rb') as source: 
    rdr = csv.DictReader(source) 
    for row in rdr: 
     if row['adifferentkey'] in products: 
      # maybe update? 
     else: 
      products[row['adifferentkey']] = row # or maybe some rearrangement 

with open('result.csv', 'wb') as target: 
    wtr = csv.writer(target) 
    wtr.writerow(['the','heading','columns']) 
    for name in sorted(product)): 
     wtr.writerow(products[name]) 

就是這樣的。

2

當然,任何能夠操作文件的編程語言都可以完成這項工作(Python/Perl/PHP/Ruby/awk等)。使用awk * nix的工具,加工利用場1作爲公共密鑰

awk -F"," 'FNR==NR{ 
    d[$1]=$0 
    next 
} 
{ 
    print d[$1],$0 
}' file1 file2 
+0

在一般情況下,您不能只使用'-F'來處理CSV文件。 CSV文件可以在字段中包含逗號和換行符,這使awk(我碰巧喜歡)非常不合適。 – 2010-03-31 16:56:50

+0

當然,如果有嵌入逗號等,僅使用'-F'是不夠的。但是,也沒有什麼能夠阻止你使用awk。有awk csv解析器或多或少做一個適當的工作。 – ghostdog74 2010-03-31 18:06:16

1

爲什麼不直接加載每個csv文件到一個共同的輸入表,然後使用SQL合併到永久表從那裏2個CSV文件的示例。示例輸入表:

InputCSVFiles 
FileID  int PK auto number/identity 
FileName string 
FileHash string 

InputCVSItems 
ItemID  int PK auto number/identity 
FileID  FK 
ProductID 
Col1 
Col2 
... 

只是將每個文件加載到表中,可以使用文件散列來防止重複文件上傳。然後,您可以使用SQL來標識重複項,並根據需要使用SQL將SELECT用於永久表中。我不知道有多少重複的產品也有,但處理起來在SQL是很容易與自己連接,COALESCE(),ROW_NUMBER(),GROUP BY,MIN()等。

​​
3

如果您使用R,則可以加載csv文件,然後執行您喜歡的任何查詢,就像處理數據庫中的表一樣。

例如,你可以使用如下命令爲每個CSV

table1 <- read.csv("D:/table1.csv", header=T, sep=",", na.strings=c(".", "NA", "", "?")) 

以下然後加載sqldf

library(sqldf) 

,並執行查詢

table3 <- sqldf("SELECT X1, X2, X3 FROM table1 JOIN table2 USING(X1)") 

最後,出口結果作爲新的csv

write.csv(table3 , file = "D:/temp/table3.csv") 
0

有一次,我寫了"dsv2sql" utility,它完全符合你的需求。下面是一個簡單的命令:

./dsv2sql --delimiter=, --output=csv --uid=id one.csv two.csv > combined_one_two.csv 

自然輸入的CSV文件標題預期。