2016-08-18 49 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循环,以避免导致包含分隔符字符的引用项目出现问题。