我需要使用dos命令行处理以下csv,以将其保存为bat文件。 该文件有一个我需要删除的可调整大小的标题,并在找到特定字符串后保留其他行 在这种情况下,我只想保留字符串" Date"之后的行。找到了。 以下文件的示例:
CSV:
----
Report,Begin Date,End Date,Currency,Change Currency
Financial Report,2016-03-26 00:00:00.000 -0600,2016-03-27 00:00:00.000 -0600,USD,Change Currency
Method,Deposits,Withdrawals,Reversepayouts,Reversedeposits,Net
PAYPAL,200.00,0.00,0.00,0.00,200.00
VISA2,1650.00,0.00,0.00,0.00,1650.00
VISA3,190.00,0.00,0.00,0.00,190.00
DISCOUNT,200.00,0.00,0.00,0.00,200.00
Total:,2240.00,0.00,0.00,0.00,2240.00
Date,Affiliate,Username,Account Id,Method,Type,Amount,Transaction Id,Note
2016-03-26 00:36:01.746 -0600,JamesX,ad123,30153,VISA2,Deposit,32.0000,244258410,VISA2
2016-03-26 01:25:53.680 -0600,JamesX,ad123,30153,VISA2,Deposit,32.0000,244263044,VISA2
2016-03-26 02:26:05.776 -0600,ChristineY,Sar,30887,ARESYS,Deposit,200.0000,244267597,PAYPAL
2016-03-26 03:53:28.313 -0600,ChristineY,doo15,35088,VISA2,Deposit,100.0000,244271237,VISA2
2016-03-26 05:01:14.420 -0600,ChristineY,doo15,35088,VISA2,Deposit,320.0000,244273790,VISA2
2016-03-26 08:40:38.593 -0600,JamesX,ad123,30153,VISA2,Deposit,33.0000,244290455,VISA2
2016-03-26 10:08:43.230 -0600,xAZER,veso,36504,VISA3,Deposit,90.0000,244302244,VISA3
答案 0 :(得分:2)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q36240256.csv"
SET "outfile=%destdir%\outfile.csv"
SET "reproduce="
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
IF NOT DEFINED reproduce (
ECHO(%%a|FINDSTR /b /L /c:"Date," >NUL
IF NOT ERRORLEVEL 1 SET "reproduce=y"
)
IF DEFINED reproduce ECHO(%%a
)
)>"%outfile%"
GOTO :EOF
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为q36240256.csv
的文件,其中包含我的测试数据。
生成定义为%outfile%
的文件将reproduce
标志设置为 nothing (因此未定义)
阅读每个文件行。如果reproduce
未定义,请使用findstr
查看行/b
是否以/L
文字/c:
常量字符串"日期,&#开头34;,处理任何输出。
如果findstr
产生的错误级别不是> 1(即0),则将reproduce
设置为某个位置。
如果设置了reproduce
,那么就不要再对这条线进行反刍了,不要再担心慢速findstr
会让更多的盲目 vitesse ...
答案 1 :(得分:2)
我会使用a regular expression find/replace utility called JREPL.BAT。 JREPL.BAT是纯脚本(混合JScript /批处理),可以在XP之后的任何Windows机器上本机运行。
该解决方案是一个基本的正则表达式查找/替换用一些用户提供的JScript来处理丢弃哪些行的逻辑。
如果你想丢弃"日期,......"标题行,然后:
jrepl "^(Date,)?.*" "($1?i++:i)?$0:false" /jmatch /jbeg "var i=0" /f test.txt /o output.txt
如果要保留标题行,则只需稍作更改:
jrepl "^(Date,)?.*" "($1?++i:i)?$0:false" /jmatch /jbeg "var i=0" /f test.txt /o output.txt
如果要使用结果覆盖原始文件,请使用/o -
。
如果将命令放在批处理脚本中,请使用call jrepl
。
可以在没有用户提供的JScript的情况下解决;但这需要/m
(多行)开关,它将整个文件加载到内存中,因此最大文件大小限制在1GB左右。
弃掉标题行:
jrepl "[\S\s]*?^Date,.*\n?([\S\s]*)" "$1" /m /f test.txt /o output.txt
保留标题行:
jrepl "[\S\s]*?(^Date,[\S\s]*)" "$1" /m /f test.txt /o output.txt