2015-01-13 50 views
0

我有一個生成包含基於時間的數據的CSV文件的系統。 某些文件具有來自兩個不同日期的數據。我想將這些文件分成兩個文件,一個包含第一天的數據,另一個包含第二天的數據。原始文件如下所示:在特定文本上分割CSV文件

09.01.2015 00:00:00,0385 - Veerhaven,VP01 in bedrijf hoog toerental,K,Process message. 
09.01.2015 00:00:00,0385 - Veerhaven,VP01 in bedrijf laag toerental,G,Process message. 
08.01.2015 23:59:55,1475 - Schaatsbaan,PO01 in bedrijf,G,Process message. 
08.01.2015 23:59:52,0311 - Abraham van Stolkweg,PO01 in bedrijf,G,Process message. 

前10個字符是事件的日期。我想分解兩個輸出文件中的文件,將這兩天的數據分開。我必須使用批處理來做到這一點,因爲它必須每天在很多文件上完成。

我希望有人能幫助我。提前致謝。

回答

0
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "file=c:\somewhere\data.txt" 

    for %%f in ("%file%") do for /f "usebackq" %%a in ("%%~ff") do (
     if not defined %%a (
      findstr /b /c:"%%a" "%%~ff" > "%%~dpnf.%%a%%~xf" 
      set "%%a=1" 
     ) 
    ) 
東西

第一個for命令僅用於檢索對該文件的引用並且能夠分隔路徑,文件名和擴展名(稍後將用於生成輸出文件)。

第二個for循環讀取輸入文件,併爲每一行使用空格作爲分隔符(for /f命令中的默認行爲)檢索行中的第一個標記/字段。此值被用來過濾輸入文件並聲明環境變量:

  • 如果沒有定義的變量,它是第一次的值被看到的那樣,匹配記錄從輸入文件中提取到一個新的輸出文件和變量被定義。

  • 如果定義了該變量,則會看到該值並生成相應的輸出文件,跳過提取並且過程繼續讀取下一行。

編輯適應評論

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "files=c:\somewhere\*.txt" 
    set "outputFolder=c:\where\to\put\files" 

    for %%f in ("%files%") do (
     setlocal 
     for /f "usebackq" %%a in ("%%~ff") do if not defined %%a (
      findstr /b /c:"%%a" "%%~ff" > "%outputFolder%\%%~nf.%%a%%~xf" 
      set "%%a=1" 
     ) 
     endlocal 
    ) 

輸入通配符管理,需要的不是改變:for %%f遍歷指定的集合,是它只是一個文件或一組文件。

輸出文件夾存儲在環境變量中。重定向更改爲使用輸入文件路徑中的變量。

由於用於確定指示的標記是否已處理的變量需要針對處理的每個文件被刪除,處理文件內容的循環被包裝在一對setlocal/endlocal中,該對在清除每個文件之後的標記變量處理

+0

它也可以修改這個通配符和輸入和輸出目錄嗎?一直在試圖修改它,但還沒有弄明白。在此先感謝 – Cornelis

+0

@Cornelis,回答編輯。 –

+0

謝謝MC ND。我還沒有完成它的工作。它只用一個文件就可以正常工作。它被分割並且結果文件被重定向到輸出目錄。但對於多個文件,它不起作用。我甚至製作了文本文件的副本,例如tst1.txt tst2.txt tst3.txt等。關閉回聲以確定發生了什麼,它們都處理完畢,但在輸出目錄中,我發現只有tst1.txt分裂。希望你能幫助我,恭喜Cornelis – Cornelis

0

閱讀HELP FOR瞭解如何使用FOR命令遍歷文件的行並解析其內容。然後,嘗試

for /f "tokens=1,*" %%a in (timedata.txt) do (
    echo %%a ... %%b 
) 

你看,你可以使用%%a按日期對文件分割,所以你可以找出像

for /f "tokens=1,*" %%a in (timedata.txt) do (
    echo %%b >>timedata.%%a.txt 
) 

或更一般

set fn=%~dpn1 
set fx=%~x1 
for /f "tokens=1,*" %%a in (%~1) do (
    echo %%b >>%fn%.%%a%fx% 
)