我們正在改變網上商店平臺,我們需要從不同來源導入產品數據。查詢:智能合併CSV文件
我們目前有來自不同系統/數據庫的幾個不同的csv文件,因爲每個系統都缺少一些信息。幸運的是,產品id相同,因此可以使用ID關聯數據。
我們需要將這些數據合併到一個大的csv文件中,以便我們可以導入到我們新的電子商務網站。
我的問題:當您需要將csv文件與相關數據合併到一個csv文件時,是否有一種通用方法?有沒有任何應用程序或工具可以幫助你?
我們正在改變網上商店平臺,我們需要從不同來源導入產品數據。查詢:智能合併CSV文件
我們目前有來自不同系統/數據庫的幾個不同的csv文件,因爲每個系統都缺少一些信息。幸運的是,產品id相同,因此可以使用ID關聯數據。
我們需要將這些數據合併到一個大的csv文件中,以便我們可以導入到我們新的電子商務網站。
我的問題:當您需要將csv文件與相關數據合併到一個csv文件時,是否有一種通用方法?有沒有任何應用程序或工具可以幫助你?
是的。使用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])
就是這樣的。
當然,任何能夠操作文件的編程語言都可以完成這項工作(Python/Perl/PHP/Ruby/awk等)。使用awk * nix的工具,加工利用場1作爲公共密鑰
awk -F"," 'FNR==NR{
d[$1]=$0
next
}
{
print d[$1],$0
}' file1 file2
在一般情況下,您不能只使用'-F'來處理CSV文件。 CSV文件可以在字段中包含逗號和換行符,這使awk(我碰巧喜歡)非常不合適。 – 2010-03-31 16:56:50
當然,如果有嵌入逗號等,僅使用'-F'是不夠的。但是,也沒有什麼能夠阻止你使用awk。有awk csv解析器或多或少做一個適當的工作。 – ghostdog74 2010-03-31 18:06:16
爲什麼不直接加載每個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()等。
如果您使用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")
我寫TxtSushi對平面文件文件進行SQL選擇和其他一些簡單的轉換。例如,您可以執行以下操作:
tssql -table t1 tbl1.csv -table t2 tbl2.csv \ 'select * from t1 inner join t2 on t1.id=t2.id'
有很多example scripts here。它作爲包裝分發到http://hackage.haskell.org,因此安裝取決於the Haskell Platform。
有一次,我寫了"dsv2sql" utility,它完全符合你的需求。下面是一個簡單的命令:
./dsv2sql --delimiter=, --output=csv --uid=id one.csv two.csv > combined_one_two.csv
自然輸入的CSV文件標題預期。
您可能會喜歡看看我的FOSS項目http://code.google.com/p/csvfix/,它也是一個可以處理這類事情的項目。 – 2010-03-31 14:38:13