【问题标题】:Regular expression for non-standard csv file非标准csv文件的正则表达式
【发布时间】:2017-04-29 22:45:58
【问题描述】:

我正在尝试找出正确解析非标准 csv 文件的解决方案。 CSV 分隔符是逗号。问题是,我必须解析第 6 个字段,但其中可以有零到多个逗号。 为了更好的可视化,这个字段用引号括起来,例如是否有一个逗号。报价可能没有。 所以我需要解析第 5 个字段之后和最后三个字段之前的所有内容。

示例:

第一记录:

546511,56756121,None,None,channel10,"abcd,efgh",2016-11-29 22:50:00+01:00,125.0,False

正则表达式结果:“abcd,efgh”


记录 2:

546511,56756121,None,None,channel10,ij,kl,mnop,2016-11-29 22:50:00+01:00,125.0,False

正则表达式结果:ij,kl,mnop


3 号记录:

546511,56756121,None,None,channel10,stuvwxyz,2016-11-29 22:50:00+01:00,125.0,False

正则表达式结果:stuvwxyz


请问正确的正则表达式是什么? 非常感谢

【问题讨论】:

  • 不是最好的。但会做这项工作。 (.*?),(.*?),(.*?),(.*?),(.*?),(.*?),(\d.*?),(.*?),(.*) 演示:regex101.com/r/hVPqRR/1

标签: regex csv


【解决方案1】:

这将为您完成:

^(?:[^,\n]+,){5}(.*)(?:,[^,\n]*){3}$

它匹配前五个字段(任何非, 字符,一次或多次,后跟,。然后它捕获所需的数据。最后它匹配最后三个字段.

导致捕获组 1。

(如果只需要匹配,则必须指定正则表达式。)

See it here at regex101.

编辑

好的,在考虑您的评论后,试试这个:

^([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),(.*),([^,]+)\+\d\d:\d\d,([^,]+),([^,\n]+)$

Here at Regex101.

(注意!如果您只打算匹配一个实例,则不需要量词{1}。)

编辑 2

好的。我们又来了。

无法通过一次操作删除组内的引号。但是,您可以使用

删除周围的引号
^([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),"?(.*?)"?,([^,]+)\+\d\d:\d\d,([^,]+),([^,\n]+)$

Here at Regex101。 (稍作修改以更好地可视化。)

【讨论】:

  • 谢谢!我已将您的正则表达式修改为:^([^,]+){1},([^,]+){1},([^,]+){1},([^,]+){1},([^,]+){1},(.*),([^,]+){1},([^,]+){1},([^,]+){1}$,因为我已经意识到,我需要将每个字段分别分组以进行下一次处理。是否可以修改此正则表达式以忽略时间戳中的“+01:00”?谢谢
  • 再次感谢!它工作完美。我意识到的最后一件事是忽略第 6 个字段内的所有引号。示例:如果有"abcd,efgh",则返回abcd,efgh 如果有"ab"cd,e""fgh",则返回abcd,efgh
  • 很高兴为您提供帮助。请标记为已接受的答案,也许可以投票;)(这就是有类似问题的人寻求帮助的方式)
  • 你能帮我解决我在上一条评论中描述的问题吗? :) 如果可能的话...
【解决方案2】:

或者,您可以指定要提取的短语的边界。例如(假设一侧有一个像“channelxx”这样的测试,另一侧有一个日期)。像这样。

^.\*channel[0-9][0-9],(.\*),20[0-9][0-9]-[0-9][0-9]-[0-9][0-9] .*

【讨论】:

    猜你喜欢
    • 2016-04-18
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多