2011-10-26 30 views
0

我真的需要使用批處理文件有助於做到以下幾點:翻譯到批處理的CSV程序

我需要按行文本文件中的行讀取,並且對於給定的CSV的每個條目文件,該文件以在文本文件行中找到的元素開始,將其寫入新的CSV文件。

或者,換句話說:

閱讀以下

example.csv 
Page, Pageviews, Bounce Rate, /category/apples, 1029, 67%, /category/brussel-sprout, 3409, 92%, /category/orange, 1233, 87% 

然後逐行讀取以下文本文件行:

example.txt 
/category/apples 
/category/orange 

創建此文件:

new.csv 
Page, Pageviews, Bounce Rate, /category/apples, 1029, 67%, /category/orange, 1233, 87% 

到目前爲止,我已經通過一個批處理文件來處理這個項目,該文件將列表中的每個單獨地址,檢查它是否具有特定標題,然後將擴展名寫入列表中。不幸的是,這還不夠,因爲我還需要從原始CSV中重新生成表格 - 但僅限於帶有標題的表格。我試圖通過Python來做到這一點,但它太麻煩了(而且系統邊界使得編寫Python無法實現)。如果你想看到代碼,你可以通過我的個人資料點擊我的問題,但他們不關心這件事。我剩下要做的就是這樣,我要求澄清和想法,因爲我的優勢不在於英美菸草公司,而在於C++(不,這不是一種選擇)。

謝謝你的幫助。這個社區(有一些例外)證明了學習寶貴經驗和推動我取得成功的極好理由。

這是我在那裏與Python領導:

import csv 

lines = [] 
with open('output.txt','r') as f: 
    for line in f.readlines(): 
     lines.append(line[:-1]) 

with open('corrected.csv','w') as correct: 
    writer = csv.writer(correct, dialect = 'excel') 
    with open('input.csv', 'r') as mycsv: 
     reader = csv.reader(mycsv) 
     for row in reader: 
      if row[0] not in lines: 
       writer.writerow(row) 
+2

如果你認爲在Python這樣做很麻煩,我想不通爲什麼你認爲批處理文件會更好。你有沒有其他的選擇,比如PowerShell? – jdigital

+0

不要這樣想,不。是否沒有簡單的方法來讀取CSV文件,就像文本文件一樣,並且說出類似於1.檢查您所在的對象是否=文本文件2中的任何文本行(如果是)。將對象和所有五個對象寫入新文件2(如果否)。移動5個對象並重復。 –

+3

哦,上帝,Windows批處理文本處理?在確定如何讓Python在你的目標上運行的過程中,你的努力會更好。 – Chriszuma

回答

3

我只是寫你需要的批處理文件。但是,我不知道.csv文件格式,所以我假設了一些細節。這些是我的假設:

  • .csv文件只包含沒有CR-LF分隔符的ASCII文本。
  • 每個.csv元素都以逗號分隔且不包含空格(此限制可能會被解決)。
  • 輸入.csv文件的大小低於8 KB(需要讀取批處理變量中的內容)。
  • .csv數據由3個元素組成:3個元素的標題,以及3個元素的每個類別。
  • .csv文件中的兩個類別和.txt文件中的行都按ASCII升序排列。
  • 。.txt文件中的類別包含在.csv中。

這是批處理文件:

@echo off 
setlocal EnableDelayedExpansion 
rem Read .csv data and split/store its elements in csv array. 
set /P csv_data=< example.csv 
set i=0 
for %%e in (!csv_data!) do (
    set /A i+=1 
    set csv[!i!]=%%e 
) 
rem Create the new.csv file with its header. 
echo %csv[1]%, %csv[2]%, %csv[3]%> new.csv 
rem Process each line of the text file. 
set i=1 
for /F %%l in (example.txt) do call :SeekAndWriteCsv %%l 
goto :eof 

:SeekAndWriteCsv 
rem Seek the matching csv category. 
set /A i+=3 
if not !csv[%i%]! == %1 goto SeekAndWriteCsv 
rem Write the matching category to the new.csv file. 
set /A j=i+1, k=i+2 
echo , !csv[%i%]!, !csv[%j%]!, !csv[%k%]!>> new.csv 

這就是它。請嘗試一下,讓我知道你遇到的任何問題。

EDIT

我只是意識到錯誤的:所述new.csv類別被放置在分開的線。爲了解決這個問題,使這些變化:

更改這些行

rem Create the new.csv file with its header. 
echo %csv[1]%, %csv[2]%, %csv[3]%> new.csv 

通過這些的

rem Create the new.csv file with its header. 
echo/> enter.txt 
set /P dummy=%csv[1]%, %csv[2]%, %csv[3]%<enter.txt> new.csv 

改變這一行

echo , !csv[%i%]!, !csv[%j%]!, !csv[%k%]!>> new.csv 

通過這一個

set /P dummy=, !csv[%i%]!, !csv[%j%]!, !csv[%k%]!<enter.txt>> new.csv 

此外,爲避免與一些特殊字符錯誤,請將報價在這一行

set csv[!i!]=%%e 

這樣

set "csv[!i!]=%%e" 
+0

我將在公司系統的明天進行全面測試,我們將看到會發生什麼!謝謝! –

+0

如果csv包含感嘆號'!',那麼它可能會失敗,並且很難解決這個問題 – jeb

+0

數據中沒有感嘆號。但好點。謝謝大家的幫助和幫助! –

1

的Windows(DOS)批處理語言是不適合這種類型的任務。雖然這可能是可能的,但所產生的腳本肯定是麻煩的,令人費解的,並且令人困惑。

Python是一個很好的解決方案,並且在發佈中不清楚爲什麼你不想使用它。如果您擔心安裝Python,請考慮py2exe,它允許您創建獨立的python可執行文件。

+0

重訪該選項。 –

+0

@jdigital:對不起。在我看來,批處理解決方案清晰直接,即使不知道批處理的人也能輕鬆跟蹤... :( – Aacini

+0

@Aacini,讓我們來看看其他StackOverflow用戶如何對此投票。 – jdigital