需要在 csv 中插入一列并在其中解析当前日期 - JREPL.BAT?

Need to insert a column in csv and parse current date in it - JREPL.BAT?

我可以(感谢 dbenham 及其强大的 JREPL.BAT)使用命令

从 CSV 文件中删除 header 行
jrepl "^(Date,)?.*" "(?i++:i)?[=11=]: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 输出的屏幕截图...

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

请注意,我在开发此解决方案时发现了一个 JREPL.BAT 小错误,因此 link 上有一个更新版本 3.8,修复了一些错误。

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

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

对解决方案的一些解释是有序的。

/JBEG 定义了在 find/replace 操作期间需要的几个变量。

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

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

  • $1 搜索 ^$ - 查找空行
    replace i=1;'' - 触发器 i 以便后续的 non-empty 行附加日期列。此行的替换值为空字符串。

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

  • $3 search ^.*?,(.+?),.* - 查找至少包含 3 个字段的行,捕获 </code>[= 中的第二个字段71=] <strong>replace</strong> <code>if(ln==2){dt=;[=29=]}else i?[=29=]+','+((i++==1)?'Date':dt):[=29=] - 这是大部分复杂逻辑所在的地方:

    • 如果这是第 2 行,则将日期字符串 (</code>) 保存在 <code>dt 中并替换为完整的匹配字符串
    • else 如果 i 不为 0,则递增 i 并替换为完整匹配的字符串加上第一次附加字符串 ',Date',否则附加 dt
    • else i=0,所以用原来的字符串替换。