2016-05-16 19 views
1

我有以下csv,我必须将一千个逗号分隔符替换为无。在下面的例子中,当我的金额为"1,000.00"时,我应该有1000.00(没有逗号,没有引号)。删除CSV中的千位分隔符号(批量命令,使用JREPL)

我用JREPL从我的CSV删除头

jrepl "(?:.*\n){1,1}([\s\S]*)" "$1" /m /f "csv/Transactions.csv" /o "csv/Transactionsfeed.csv") 

我在想,如果我能做到去除头+与千个逗号在一个步骤处理的过程。 我也开了与在第二步另一个命令做它的选项...

Tnx ID,Trace ID - Gateway,Profile,Customer PIN,Customer,Ext. ID,Identifier,Amount,Chrg,Curr,Processor,Type,Status,Created By,Date Created,RejectReason 
1102845,3962708,SL,John,Mohammad Alo,NA,455015*****9998,900.00,900.00,$,Un,Credit Card,Rejected,Internet,2016-05-16 06:54:10,"-330: Fail by bank, try again later(refer to acquirer)" 
1102844,3962707,SL,John,Mohammad Alo,NA,455015*****9998,"1,000.00","1,000.00",$,Un,Credit Card,Rejected,Internet,2016-05-16 06:52:26,"-330: Fail by bank, try again later(refer to acquirer)" 

回答

1

是的,有一个非常有效和相当紧凑和直接的解决方案:

jrepl "\q(\d{1,3}(?:,\d{3})*(?:\.\d*)*)\q" "$1.replace(/,/g,'')" /x /j /jendln "if (ln==1) $txt=false" /f "csv/Transactions.csv" /o "csv/Transactionsfeed.csv" 

/JENDLN JScript表达式通过将$ txt设置为false(如果它是第一行)来剥去标题行。

搜索字符串与包含逗号作为千分号的任何带引号的数字相匹配,而$ 1是不带引号的数字。

替换字符串是一个JScript表达式,用于替换匹配的$ 1数字中的所有逗号。

编辑

注意上面可能会与任何CSV,你很可能有工作。但是,如果您的引用字段包含带引号的字符串文字,则会失败。类似以下内容会产生一个损坏的CSV与上面的代码:

...,"some text ""123,456.78"" more text",... 

此问题可以修复多一些正则表达式代码。如果开始报价前面有一个逗号或行的开头,则只需修改一个带引号的数字,而结束引用后面应紧跟逗号或行尾。

前瞻断言可以用于尾随逗号/ EOL。但JREPL不支持后视。因此,领先的逗号/ BOL必须被捕获,并在评论中更换

jrepl "(^|,)\q(\d{1,3}(?:,\d{3})*(?:\.\d*)*)\q(?=$|,)" "$1+$2.replace(/,/g,'')" /x /j /jendln "if (ln==1) $txt=false" /f "csv/Transactions.csv" /o "csv/Transactionsfeed.csv" 

编辑保存在应对不断变化的需求

下面将简单地从报价CSV字段删除所有引号和逗号。我不喜欢这个概念,并且我怀疑有更好的方法来处理这个导入到mysql的问题,但这是OP所要求的。

jrepl "(^|,)(\q(?:[^\q]|\q\q)*\q)(?=$|,)" "$1+$2.replace(/,|\x22/g,'')" /x /j /jendln "if (ln==1) $txt=false" /f "csv/Transactions.csv" /o "csv/Transactionsfeed.csv" 
+0

您的解决方案完美适用于千和第一行删除的逗号。如果在双引号之间用逗号分隔字符串,我只注意到一个错误,如下例所示:字段“Special Bonus,OK allan”使其失败(字段中的“,”也应该被删除) Tnx ID,Trace ID - 网关,配置文件,客户PIN,客户,分机ID,标识符,数量,Chrg,Curr,处理器,类型,状态,创建者,创建日期,拒绝原因 1102921,SL,jojo,Mohamed,“Special Bonus,OK allan”,200.00,200.00,$,ManualBonus,泛型,核准,maurice,2016-05-16 15:26:26 –

+0

@RenaudDUGERT - 哼!为什么要删除引号内的所有逗号?这当然不符合你的要求。并且盲目地从引用字段中删除所有逗号可能会改变含义。我明白你为什么要从数字中删除逗号,但不是所有的逗号。但这当然是一个更容易解决的问题。 – dbenham

+0

你是对的...我的错误!但将csv导入到mysql会使字符串中的逗号更难处理。在这种特定情况下,删除字符串(双引号之间)中的逗号将是必要的... –

1

我可以为你建议一个不同的,更简单的解决方案吗?下面的5行批处理文件做你想要的;将其保存为.bat扩展名:

@set @a=0 /* 
@cscript //nologo //E:JScript "%~F0" < "csv/Transactions.csv" > "csv/Transactionsfeed.csv" 
@goto :EOF */ 

WScript.Stdin.ReadLine(); 
WScript.Stdout.Write(WScript.Stdin.ReadAll().replace(/(\"(\d{1,3}),(\d{3}\.\d{2})\")/g,"$2$3")); 

JREPL.BAT是一个大型且复杂的程序,能够执行高级替换任务;但是,您的请求非常简单。此代码也是一个Batch-JScript混合脚本,它以与JREPL相同的方式使用replace方法。英美烟草,但这是根据您的具体要求量身定制的。

  • 第一个ReadLine()读取输入文件的标题行,所以后面的ReadAll()读取并处理剩下的行。
  • 正则表达式(\"(\d{1,3}),(\d{3}\.\d{2})\")定义了括在括号内的3个子匹配:第一个是用引号括起来的整数,如"1,000.00";第二个子匹配是逗号前的数字,第三个子匹配是逗号后的数字,包括小数点。
  • .replace方法改变了以前的正则表达式,即整个数字用引号括起来只是第二和第三个子匹配。
+0

伟大的解决方案。我得到的唯一问题(我的错误!)我在那个例程中提到dbenham的内容也是在双引号字符串中删除逗号,例如“Special Bonus,OK allan”改为“Special Bonus OK allan”。任何想法? –

+0

如果数字是“1,234,567.89”',会发生什么情况。这种简单的解决方案对数量级有固有的限制。尽管如果所有引号逗号被删除,解决方案更简单。 – dbenham

+0

感谢您的评论。在这个实际的例子中,金额不应该大于999,999.99,但它是有道理的... –