如何根据带有标题的第二列值将CSV文件拆分为多个文件(不使用AWK)

如何根据带有标题的第二列值将CSV文件拆分为多个文件(不使用AWK),csv,batch-file,Csv,Batch File,我需要能够运行一个.bat文件来查看这个CSV,并根据Col C-Customer Code中的值将其拆分为多个CSV,每个文件生成时都带有文件头 例如 .bat应运行并将CSV拆分为两个单独的CSV: CSV1: CSV2: 下面是我从internet上尝试和搜索的代码,但我仍然面临打印输出文件头的问题,我不知道如何检查C列的值 @echo off set file=invoice.csv REM get header: set /p header=<%header%\invo

我需要能够运行一个.bat文件来查看这个CSV,并根据Col C-Customer Code中的值将其拆分为多个CSV,每个文件生成时都带有文件头

例如

.bat应运行并将CSV拆分为两个单独的CSV:

CSV1:

CSV2:

下面是我从internet上尝试和搜索的代码,但我仍然面临打印输出文件头的问题,我不知道如何检查C列的值

 @echo off
 set file=invoice.csv

 REM get header:
 set /p header=<%header%\invoice.csv

 REM process file line by line (ignore header):
 for /f "skip=1 tokens=,* delims=," %%a in (%file%) do (
  set line=%%1
   if not exist "%%a.csv" echo %header%>"%%a.csv"
   echo %%a,%%b>>"%%a.csv"
 )
@echo关闭
设置文件=invoice.csv
REM get标题:
设置/p标题=“%%a.csv”
回显%%a,%%b>>“%%a.csv”
)
谢谢你的帮助^ ^

@echo off
@echo off
set file=invoice.csv

REM get header:
set /p header=<%file%

REM process file line by line (ignore header):
for /f "skip=1 delims=" %%A in (%file%) do (
  for /f "tokens=2 delims=," %%B in ("%%A") do (
    if not exist "%%B.csv" echo %header%>"%%B.csv"
    >>"%%B.csv" echo %%A
  )
)
设置文件=invoice.csv REM get标题: 设置/p标题=“%%B.csv” >>“%%B.csv”回显%%A ) )
鉴于CSV数据中没有任何字段(或单元格值)本身包含逗号
(当值包含在
”中时,该值在CSV中有效),您可以使用单行来筛选所需信息,甚至包括标题行。要将提取的数据写入文件,请使用。下面是一些示例代码:

findstr/I/R%=使用常规的epression搜索;删除区分大小写搜索的“/I=%^
/C:“^[^,]*,[^,]*,客户代码,”%=第三列标题;忽略跳过标题=%^
/C:“^[^,]*,[^,]*,C100000,”%=第三列值;可能还有更多=%^
“invoice.csv”>“invoice_C100000.csv”
findstr/I/R%=使用常规的epression搜索;删除区分大小写搜索的“/I=%^
/C:“^[^,]*,[^,]*,客户代码,”%=第三列标题;忽略跳过标题=%^
/C:“^[^,]*,[^,]*,C111000,”%=第三列值;可能还有更多=%^
“invoice.csv”>“invoice_C111000.csv”
或每行写一行,无任何行内注释:

findstr/I/R/C:“^[^,]*,[^,]*,客户代码,”/C:“^[^,]*,[^,]*,C100000”,“invoice.csv”>“invoice_C100000.csv”
findstr/I/R/C:“^[^,]*,[^,]*,客户代码,”/C:“^[^,]*,[^,]*,[^,]*,C111000”,“invoice.csv”>“invoice_C111000.csv”
使用的搜索字符串(或正则表达式)如
^[^,]*,[^,]*,CustomerCode,
表示:

  • ^
    ——锚定匹配到行的开头
  • 两次相同的顺序:
    • [^,]
      ——定义一个反向字符类,并匹配除
      以外的任何字符
    • *
      ——与前面的表达式零次或多次匹配
    • ——匹配文字逗号
  • CustomerCode
    ——匹配列标题的搜索字符串的文字部分(或列值
    C100000
    c11000
  • ——匹配文字逗号
  • 不考虑剩余的行字符串
您的问题是
如何。。。。[不使用AWK]
但您用
AWK
标记了它。。。什么意思?“嘿,awk的人,注意,看这里,请不要用awk来解决这个问题”请接受我的哀悼,因为使用Unix awk命令(强大的Unix awk!)抱歉再次打扰…如果需要使用awk文件分析多个数据文件,我应该如何继续?我尝试的代码如下:@echo off set file=invoice.csv REM get header:set/p header=“%%B.csv”>>”%%B.csv“echo%%A)nawk-f“1.awk”%%B.csv>>1.csv)但我得到的结果是错误的,因为它无法读取B.csv文件。请不要在注释中发布整批内容-如果没有换行符,很难读取。如果我的回答满足了你的问题,你应该通过投票或者打勾来表示尊重。为了获得更广泛的读者群,你应该提出新的问题,然后加上适当的标签。这有点遥不可及,但是如何补偿包含逗号的字段呢?
 Invoice,PORef,CustomerCode,CustomerName,DocumentDate,ProductCode,ProductName
 111222,PO321,C111000,My Store,1/10/15,AB1000,Test Soft Toy
 111222,PO321,C111000,My Store,1/10/15,AB1001,Test Soft Toy1
 111222,PO321,C111000,My Store,1/10/15,AB1002,Test Soft Toy2
 @echo off
 set file=invoice.csv

 REM get header:
 set /p header=<%header%\invoice.csv

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

REM get header:
set /p header=<%file%

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