如何根据带有标题的第二列值将CSV文件拆分为多个文件(不使用AWK)
我需要能够运行一个.bat文件来查看这个CSV,并根据Col C-Customer Code中的值将其拆分为多个CSV,每个文件生成时都带有文件头 例如 .bat应运行并将CSV拆分为两个单独的CSV: CSV1: CSV2: 下面是我从internet上尝试和搜索的代码,但我仍然面临打印输出文件头的问题,我不知道如何检查C列的值如何根据带有标题的第二列值将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
@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
)
)