【问题标题】:Complex regex to replace commas with dots for quoted values then remove quotes [closed]复杂的正则表达式用点替换逗号作为引用值,然后删除引号 [关闭]
【发布时间】:2017-01-04 18:02:06
【问题描述】:

我有一些 csv 文件被错误地导出。某些包含数字的字段被错误地导出为字符串,小数点为逗号而不是点。

这里有几个例子:

"GREEN,"15,4",55,"15,5",64,"17,0","18,9",107,145,21,38, "BLUE","15,1",46,"15,2",51,"11,4","13,5",89,96,25,7,

所以,我想将引号中数字的逗号切换为点,然后从所有数字中删除引号。

谁能帮帮我?

【问题讨论】:

  • 如果你表明你已经尝试自己解决这个问题,你会发现人们会更加慷慨地帮助你
  • 你的例子是混淆哪些数字被引号包围?
  • @Meninx 我猜像"15,4" 这样的值应该变成15.4 不带引号。

标签: regex perl


【解决方案1】:

使用 CSV 解析器,这变得很容易:

#!/usr/bin/perl
use warnings;
use strict;

use Text::CSV_XS;

my $csv = Text::CSV_XS->new( { binary => 1, auto_diag => 1 } );

while ( my $row = $csv->getline( \*DATA ) ) {
   s/,/./ for @$row;
   $csv->say( \*STDOUT, $row );
}


__DATA__
"GREEN","15,4",55,"15,5",64,"17,0","18,9",107,145,21,38,
"BLUE","15,1",46,"15,2",51,"11,4","13,5",89,96,25,7,

上面的示例使用内联数据使其可独立运行 - 您可能希望使用输入和输出文件而不是 DATASTDOUT

如果您特别想在“字符串”而不是“数字”周围保留引号,那么您可以使用 keep_meta_info 或在需要时重新添加它们。

【讨论】:

  • 为什么投反对票?这是正确的解决方案!
  • 也许因为正则表达式太通用,可以匹配合法字符串?
【解决方案2】:
,(?!(?:[^"]*"[^"]*")*[^"]*$)

您可以在" 之间使用此删除,。查看演示。

https://regex101.com/r/t5Euq1/1

【讨论】:

  • 为什么投反对票?
  • 感谢您的链接 - 很棒的网站 ;o)。我什至没有特权得到数字周围的引号,因此regex101.com/r/t5Euq1/6([;]?["]*[0-9]+)[,]([0-9]+["]*[;]?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 2014-05-10
  • 1970-01-01
  • 2016-11-13
  • 2011-09-17
  • 1970-01-01
相关资源
最近更新 更多