2014-02-22 97 views
0

我期待創建一個.cmd文件,該文件可以篩選文件夾中的所有.csv文件,然後使用結果創建一組.csv文件。篩選csv文件並使用數據創建一組.csv文件

這是場景。

有一個文件夾中的許多文件中的.csv
數據的CSV文件中的第一列包含一個代碼HH??????-XX, 其中??????可能是從01 to 48

任何一組數字和XX範圍我想批處理文件以01開始XX何HH??????-01找到需要的行並將結果放置在名爲輸出文件-01.csv

開頭的代碼HH可能是不同的,因此它必須還過濾器HH

然後對文件夾中的每個csv文件重複此操作。

然後整個過程重複HH??????-02和文件名爲-02.csv CSV輸出等多達高達-48.csv

我沒有很多 - 我不是這方面的專家,在所有的,只是在VBA

我從網上獲得了這個模板,我認爲我可以改進,但我並不真正瞭解如何適應這一點。我不熟悉的for循環在.csv文件

@echo off 
del c:\Total.csv 
Del c:\Final.csv 

Type c:\BATTEST\*.CSV > c:\Total.csv 

FOR /F "eol=- delims=~ tokens=1-5,6,7*" %%1 IN (c:\Total.CSV) DO IF %%4 EQ 456 ECHO %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 >> c:\Final.csv 

示例行是:(記住,HH可能是不同的東西)

HH777777-01,A,500,200,10,11,12,13,15.2,17.9,26,B 
HH236748-02,C,300,100,11,14,17,19,21.2,18.9,14,B 

每個文件都有一個頭是整個和相同在最終的輸出文件中包含這個頭文件會很好。

標題是

Code,type,head,file,make,run,style,line,edge,model,letter,status 
+0

我相信從文件中一些實際的例子,將有助於人們理解的要求(所有'*'S和'XX's是有點混亂)。另外,你到目前爲止還有什麼?你熟悉'FOR'循環嗎? – mbroshi

+0

@mbroshi感謝您的回覆我已更新我的帖子,以獲取更多信息 – Ingram

回答

0
編輯

:添加一個target folder和cd命令用於source folder

這在這裏有效 - 在一些示例文件上測試它。

@echo off 
setlocal enabledelayedexpansion 
set "target=d:\target\folder" 
cd /d "c:\source\folder" 
for /L %%a in (101,1,148) do (
    set num=%%a 
    del "%target%\-!num:~-2!.csv" 2>nul 
    >"%target%\-!num:~-2!.csv.txt" echo Code,type,head,file,make,run,style,line,edge,model,letter,status 
) 

for %%a in (*.csv) do (
    for /f "skip=1 usebackq delims=" %%b in ("%%a") do (
     for /f "tokens=1,2 delims=-," %%c in ("%%b") do (
      set "line=%%c" 
      if /i "!line:~0,2!"=="HH" >> "%target%\-%%d.csv.txt" echo %%b 
     ) 
    ) 
) 
ren "%target%\*.csv.txt" *. 
pause 
+0

您究竟做了這個foxidrive,這絕對是太棒了!我在哪裏可以學到這個? – Ingram

+0

我最大最熱烈的感謝您的幫助!!!!! – Ingram

+0

我可以問一個更多的問題..我如何瞄準一個particualr文件夾和輸出文件到另一個文件夾? – Ingram

0
@ECHO OFF 
SETLOCAL 
FOR /L %%a IN (101,1,148) DO CALL :header %%a 

FOR %%f IN (q21956251*.csv) DO (
FOR /f "usebackqskip=1delims=" %%a IN ("%%f") DO (
    FOR /f "tokens=2delims=-," %%d IN ("%%a") DO (
    FOR /L %%h IN (101,1,148) DO IF "1%%d"=="%%h" >>"-%%d.new" ECHO(%%a 
) 
) 
) 
FOR /L %%a IN (101,1,148) DO CALL :rennew %%a 

GOTO :EOF 

:header 
SET "destfile=%1" 
>"-%destfile:~-2%.new" ECHO(Code,type,head,file,make,run,style,line,edge,model,letter,status 
DEL "-%destfile:~-2%.csv" 2>NUL 
GOTO :eof 
:rennew 
SET "destfile=%1" 
REN "-%destfile:~-2%.new" "-%destfile:~-2%.csv" 
GOTO :eof 

你不解釋你的意思由The code HH at the beginning could be different so it would have to also filter for HH - 沒有明確的規範,我們啓動一個猜謎遊戲。

這一例程將首先創建一組新的稱爲-nn.new對於n = 01至48的文件,標題行寫入每個然後刪除任何現有-nn.csv

下一步是選擇所有.csv文件 - 我選擇q21956251*.csv進行測試。每個文件名依次分配到%%f

然後%%a接收從文件%%f每一行。該「有usebackq is required because %%˚Fis quoted (in case of spaces in filenames). The跳過= 1個means skip the first line (because it's a header) and the delims = means分配整個line`。

接下來for着眼於%%a線和選擇第二(tokens=2)字符組,其中-,均爲分隔符。這應該從你的數據選擇01和「02」。數字「101」到「148」,然後用1與檢索到%%d數量的級聯進行比較。當有一個比賽,該行%%a被讀取從文件中將附加到-%%d.new

當所有.csv文件已被處理時,:rennew程序重命名所有的-nn.new-nn.csv的。

可以在沒有重命名週期的情況下處理該序列。這就是我使用的方式。

+0

這似乎不起作用,它創建具有創建名稱的csv文件並將標題放入每個文件中,但它不會將數據放入csv中。 Foxi的方法效果很好。不過,我感謝你付出努力幫助:D我們可以看看它爲什麼不起作用? – Ingram

+0

你確實已經把'q21956251 * .csv'改成'* .csv'了嗎? – Magoo

+0

哈哈,不!讓我再嘗試一次! – Ingram

0

各種條件過濾的CSV可以EasyMorph完成(它有一個免費版本)。您可能需要使用EasyMorph中的參數將XX代碼傳遞到項目中。