需要在 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,所以用原来的字符串替换。
我可以(感谢 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 搜索
^$
- 查找空行
replacei=1;''
- 触发器i
以便后续的 non-empty 行附加日期列。此行的替换值为空字符串。$2 搜索
^,,Total:,.*
- 查找最后的总计行
replacefalse
- 防止打印总行$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,所以用原来的字符串替换。
- 如果这是第 2 行,则将日期字符串 (