2016-08-18 51 views
-4

我有發票數據的CSV列值的多個文件 - 例如:
•發票#
•PO參考
•客戶代碼
•客戶名稱
•文檔日期
•產品編號
•產品名稱如何分割一個CSV文件導入基於與頭(不使用AWK)

這CSV會有不同的每張發票線,涉及發票貨號線,可以跨越多個INVOIC量電話號碼。

我需要能夠運行一個批處理文件來看看這個CSV和分裂成基於在柱A值多的CSV - 發票和每個文件與文件頭中產生。

如:

Invoice,PORef,CustomerCode,CustomerName,DocumentDate,ProductCode,ProductName 
111222,PO123,C100000,Test Store,1/1/15,AB1000,Test Soft Toy 
111222,PO123,C100000,Test Store,1/1/15,AB1001,Test Soft Toy1 
111222,PO123,C100000,Test Store,1/1/15,AB1002,Test Soft Toy2 
222111,PO321,C111000,My Store,1/10/15,AB1000,Test Soft Toy 
222111,PO321,C111000,My Store,1/10/15,AB1001,Test Soft Toy1 
222111,PO321,C111000,My Store,1/10/15,AB1002,Test Soft Toy2 

的蝙蝠應該運行和分裂CSV成2個獨立的CSV的:

CSV1:

Invoice,PORef,CustomerCode,CustomerName,DocumentDate,ProductCode,ProductName 
111222,PO123,C100000,Test Store,1/1/15,AB1000,Test Soft Toy 
111222,PO123,C100000,Test Store,1/1/15,AB1001,Test Soft Toy1 
111222,PO123,C100000,Test Store,1/1/15,AB1002,Test Soft Toy2 

CSV2:

Invoice,PORef,CustomerCode,CustomerName,DocumentDate,ProductCode,ProductName 
222111,PO321,C111000,My Store,1/10/15,AB1000,Test Soft Toy 
222111,PO321,C111000,My Store,1/10/15,AB1001,Test Soft Toy1 
222111,PO321,C111000,My Store,1/10/15,AB1002,Test Soft Toy2 

獲取軟件安裝在米Ÿ服務器將一個麻煩 - 因爲這樣,是否有無論如何,這可以無需安裝軟件,這將讓我非常開心來完成。

我意識到,已經有以前問類似的問題 - 但是,我一直沒能找出是否有另一個劇本我可以在不安裝運行awk中。

問候阿莫爾Murkute

+0

Windows機器?改爲使用vbscript。 – FloatingKiwi

+0

請分享您迄今爲止所嘗試的內容,並準確描述您卡住的位置! StackOverflow不是免費的代碼寫作服務!請學習[如何問](http://stackoverflow.com/help/how-to-ask)! – aschipfl

回答

1

其實,這是很容易一批:

@echo off 
set file=full.csv 

REM get header: 
<full.csv set /p header= 

REM process file line by line (ignore header): 
for /f "skip=1 tokens=1,* delims=," %%a in (%file%) do (
    if not exist "%%a.csv" echo %header%>"%%a.csv" 
    echo %%a,%%b>>"%%a.csv" 
) 

分割每行分爲兩個令牌(發票和「其餘的行」)。作爲分割文件的名稱,您可以使用發票號碼。

+0

@ECHO OFF SETLOCAL SET 「DESTDIR = U:\測試」 MD 「%DESTDIR%」 2> NUL FOR/F 「令牌= 1 * delims =」 %%一個IN( 「DIR/B /廣告/ OD 「%DESTDIR%\ NewsxpressInvoices _ * CSV格式。」')DO( 組 「的資源文件= %%一個」 轉到havefile) :havefile FOR/F 「delims =」 %%一個IN(%DESTDIR%\ %sourcefile%)DO( FOR/f「tokens = 1delims =,」%% x IN(「%% a」)DO( >>「%destdir%\ inv %% x.csv」ECHO(%% a ) ) GOTO:EOF - 你可以在上面的代碼中修改我將不勝感激。謝謝amol –

+0

您希望您的csv在新創建的文件夾中?嗯...確定嗎? – Stephan

+0

是的,我確定。 - 感謝 –

0

解析CSV數據正確不批腳本是微不足道的,所以我決定我提供了一個解決方案,雖然你沒有表現出任何自己的研究,也沒有分享的任何努力。

假設您的CSV文件不包含任何全局通配符?*,下面的代碼片段可能爲你工作(提供CSV輸入文件作爲命令行參數):

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "FILE=%~f1" 
set "FSEP=_" 
set "DSEP=," 
set "DCOL=Invoice" 
set /A "NCOL=0" 

if not defined FILE set "FILE=%~dpn0.csv" 
if not defined FSEP set "FSEP=_" 
if not defined DSEP set "DSEP=," 
set /A "NCOL+=0" 

for %%F in ("%FILE%") do (
    set "FLAG=#" 
    2> nul del /Q "%%~dpnF%FSEP%*%%~xF" 
    for /F usebackq^ delims^=^ eol^= %%L in ("%%~fF") do (
     set "LINE=%%L" 
     set /A "CIDX=0" 
     setlocal EnableDelayedExpansion 
     rem Double " characters: 
     set "LINE=!LINE:"=""!^" 
     set "LINE="!LINE:%DSEP%=","!"" 
     if defined FLAG (
      if defined DCOL (
       for %%I in (!LINE!) do (
        endlocal 
        set /A "CIDX+=1" 
        if /I "%%~I"=="%DCOL%" set /A "NCOL=CIDX" 
        setlocal EnableDelayedExpansion 
       ) 
      ) 
      endlocal 
      set "FLAG=" 
      set "HEAD=%%L" 
      setlocal EnableDelayedExpansion 
     ) else (
      set "NAME=" 
      for %%I in (!LINE!) do (
       endlocal 
       set /A "CIDX+=1" 
       setlocal EnableDelayedExpansion 
       if !CIDX! EQU !NCOL! (
        endlocal 
        set "NAME=%%~I" 
        setlocal EnableDelayedExpansion 
       ) 
      ) 
      if defined NAME (
       if not exist "%%~dpnF%FSEP%!NAME!%%~xF" (
        > "%%~dpnF%FSEP%!NAME!%%~xF" (echo(!HEAD!) 
       ) 
       >> "%%~dpnF%FSEP%!NAME!%%~xF" (echo(!LINE!) 
      ) 
     ) 
     endlocal 
    ) 
) 

endlocal 
exit /B 

的產生的輸出文件被存儲在輸入文件的位置,並命名爲像所附從屬柱(_分離)的值的輸入文件。

用於分割該文件以把該柱既可以由列(標題)名稱由可變DCOL給定,或(如果DCOL爲空/未定義)通過由可變NCOL的列號。

此腳本不使用for /F來獲取字段(單元格)項目,而是使用標準for循環,以避免導致包含分隔符字符的引用項目出現問題。