2012-01-03 47 views
1

我有一個CSV文件,格式如下:如何根據文件夾中的數據存儲將標籤添加到CSV文件的末尾?

0001 @ word @ some information @ other information @ 

最後一欄爲空。我想標記每行並將標記放在最後一列。

我也有一個目錄,用純文本文件填充,其中只包含單詞列表(每行1個)。每個列表的文件名與我想要應用的標籤相同。

列表/ 列表/ fruit1 列表/ fruit2 列表/ vegetables1 列表/ vegetables2

如何添加包含在CSV第2欄的單詞完全匹配的所有文件名到CSV的結尾?例如:

CSV中的一行代碼如下所示,在「fruit1」和「fruit2」的兩個列表中均出現「香蕉」一詞。

0004 @ banana @ some information @ other information @ 

線以上就必須加入到CSV的最後一列這兩個文件的名稱:

0004 @ banana @ some information @ other information @ fruit1 fruit2 

回答

1

您可以使用一個循環來讀取每一行做到這一點。使用cut提取第二個字段,然後使用grep查找包含此字段的文件。然後echo輸出你的結果。

這是如下圖所示:

while read line 
do 
    word=$(cut [email protected] -f2 <<< "$line") 
    results=($(grep -l $word Lists/*)) 
    echo "$line ${results[@]##*/}" 
done < input.txt 
1

如果Word文件存放在內存中,這樣一個解決辦法是閱讀的內容,他們的一切,並將它們映射到一個字典,其中鍵是標籤應用和值是這些標籤的組詞:

tags = {} 
for filename in filenames: 
    with open(filename) as f: 
     tags[filename] = {line.strip() for line in f} 

之後,輸入csv文件可以被讀取併爲每個升ine,可以檢查單詞列以驗證它是否包含在任何標籤中,如果是這種情況,請將標籤添加到所需的列。一旦創建了標籤欄,結果,如果寫入到新標籤欄一起包含相同的數據的輸出CSV文件:

import csv 

word_column_number = 1 
tags_column_number = 4 

reader = csv.reader(open(input_csv), delimiter='@') 
writer = csv.writer(open(output_csv, 'w'), delimiter='@') 
for row in reader: 
    word_column = row[word_column_number].strip() 
    tag_column = [name for name, words in tags.iteritems() 
        if word_column in words] 
    row[tags_column_number] = ' {0}'.format(' '.join(tag_column)) 
    writer.writerow(row) 
+0

對不起,我錯誤地認爲,這個問題是python標記的。無論如何,如果你願意嘗試,這應該適合你。 – jcollado 2012-01-03 10:00:03

1

這就造成從列表的文件sed腳本/並運行它CSV文件:

(cd ./Lists; 
for file in * ; do 
    sed 's%^%/^[^@]*@ %; 
      s%$% @/s/$/ '$file'/%' $file 
done) | sed -f- file.csv 
相關問題