【问题标题】:remove header from CSV file when string is found (ms dos command line)找到字符串时从 CSV 文件中删除标题(ms dos 命令行)
【发布时间】:2016-03-26 20:01:59
【问题描述】:

我需要使用 dos 命令行处理以下 csv 以将其保存为 bat 文件。 该文件有一个我需要删除的可调整大小的标题,并在找到特定字符串后保留其他行 在这种情况下,我只想保留找到字符串“日期”之后的行。 下面的文件示例:

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

【问题讨论】:

  • 字符串“日期”在第一行。您只是想删除第一行,还是只想保留以日期开头的行?
  • 你问得对……只有以“DATE”开头的行。

标签: csv batch-file command-line-tool


【解决方案1】:

我会使用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

【讨论】:

  • 恭喜。非常直接的解决方案!
  • 您的专业知识可以再次帮助我!我对下面这个文件有同样的问题,但我还需要在第一列中插入日期
  • @RenaudDUGERT - 这听起来像是一个新问题。但是如果你想使用JREPL.BAT,你应该学习正则表达式,以及初级的JScript。完整的 JREPL.BAT 文档可从命令行通过 jrepl /? 获得。在你提出问题之前,你应该尝试自己解决它。
【解决方案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

您需要更改sourcedirdestdir 的设置以适应您的情况。

我使用了一个名为 q36240256.csv 的文件,其中包含您的数据用于我的测试。

生成定义为 %outfile% 的文件

reproduce 标志设置为nothing(所以它是未定义的)

读取每个文件行。如果reproduce 未定义,则使用findstr 来查看/b 行是否以/L 文字/c: 常量字符串“日期”开头,处理任何输出。

如果findstr 产生的错误级别不是>1(即0),则将reproduce 设置为某个值。

如果 reproduce 已设置,则反省该行,不要再担心速度较慢的 findstr 会更令人眼花缭乱vitesse...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2018-07-29
    • 2017-11-16
    • 2016-12-07
    • 1970-01-01
    • 2016-11-02
    相关资源
    最近更新 更多