【问题标题】:Need to insert a column in csv and parse current date in it - JREPL.BAT?需要在 csv 中插入一列并在其中解析当前日期 - JREPL.BAT?
【发布时间】:2016-03-27 12:47:47
【问题描述】:

我可以(感谢 dbenham 及其强大的 JREPL.BAT)使用命令从 CSV 文件中删除标题行

jrepl "^(Date,)?.*" "($1?i++:i)?$0:false" /jmatch /jbeg "var i=0" /f test.txt /o output.txt

我现在需要在此 csv 中插入每一行的第一列(此处为 2016-03-27)的日期下方,并删除最后一行(总计)。 jrepl 也会这样做吗?谢谢!

Report,Begin Date,End Date,Currency,Change Currency
Activity Summary By Account,2016-03-27 00:00:00.000 -0600,2016-03-28 00:00:00.000 -0600,USD,Change Currency

Affiliate,Account,Screen Alias,Total Wagered,Total Payout,Net Win Loss,Percent Payout
FaridZ,BuF,BuFis,1153.00,828.00,325.00,71.81%
JohnX,adel,adel,104.70,71.70,33.00,68.48%
FaridZ,chat00,shat,49065.00,45987.50,3077.50,93.72%
,,Total:,"50,657.70","47,247.20","3,410.50",93.26%

更新:最终 csv 输出的屏幕截图...

【问题讨论】:

  • 你的问题不清楚。显示输出应该是什么样子。
  • 您好,感谢 dbenham 对此进行调查。我要添加最终输出的截图(excel)!
  • 比起截图,我认为输出的简单文本表示会更好。
  • 好的,我已经发布了截图。告诉我你是否需要它的文字,我会添加它。谢谢!
  • 截图没问题。但是显示的输出并没有删除 Total: 行,所以我对您的要求感到困惑。

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


【解决方案1】:

这可以通过JREPL.BAT 有效地完成,但如果您想通过输入数据一次完成所有操作,则解决方案相当复杂。我不确定该解决方案是否比编写自定义 JScript 或 VBS 脚本更简单。

请注意,我在开发此解决方案时发现了一个小的 JREPL.BAT 错误,因此链接中提供了更新的 3.8 版,修复了一些错误。

jrepl "^$|^,,Total:,.*|^.*?,(.+?),.*"^
      "i=1;''|false|if(ln==2){dt=$4;$0}else i?$0+','+((i++==1)?'Date':dt):$0"^
      /jmatch /jbeg "var i=0, dt" /t "|" /f test.txt /o output.txt

我使用续行来使代码更易于阅读。

按顺序解释一下解决方案。

/JBEG 定义了查找/替换操作期间需要的几个变量。

  • dt - 保存捕获的日期字符串。
  • i - 用于控制是否附加任何内容:
    • 如果i=0 则没有变化
    • 如果i=1 则附加Date 标头
    • 否则附加dt

我使用/JMATCH/T 选项以及| 作为分隔符。 /T 选项类似于 unix tr 命令。对于查找字符串中的每个定界搜索,替换字符串中都有一个对应的 JScript 表达式。

  • $1 搜索 ^$ - 查找空行
    替换 i=1;'' - 触发 i 以便后续的非空行附加日期列。此行的替换值是一个空字符串。

  • $2 搜索 ^,,Total:,.* - 查找最后的总行
    替换 false - 防止打印总行

  • $3 search ^.*?,(.+?),.* - 查找至少包含 3 个字段的行,捕获 $4 中的第二个字段
    替换 if(ln==2){dt=$4;$0}else i?$0+','+((i++==1)?'Date':dt):$0 - 这是大多数复杂逻辑所在的地方:

    • 如果这是第 2 行,则将日期字符串 ($4) 保存在 dt 中并替换为完全匹配的字符串
    • 否则,如果i 不为0,则递增i 并替换为第一次完整匹配的字符串加上追加字符串',Date',否则追加dt
    • 否则i=0,所以替换为原始字符串。

【讨论】:

  • 你是最棒的。感谢您在复杂的周末期间的第二次帮助,您两次拯救了这一天。太棒了!!!
猜你喜欢
  • 2021-03-29
  • 2013-01-24
  • 2017-04-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多