【问题标题】:How to split CSV line according to specific pattern如何根据特定模式拆分 CSV 行
【发布时间】:2013-05-17 10:27:14
【问题描述】:

在 .csv 文件中,我有如下几行:

10,"nikhil,khandare","sachin","rahul",viru  

我想用逗号 (,) 分割行。但是我不想在双引号(“”)之间分割单词。如果我使用逗号分割,我将得到包含以下项目的数组:

10  
nikhil  
khandare  
sachin  
rahul  
viru  

但我不希望双引号之间的项目被逗号分隔。我想要的结果是:

10
nikhil,khandare
sachin
rahul
viru

请帮我解决这个问题。

【问题讨论】:

  • 请添加您已经制作的代码,以便我们帮助您修复它。
  • 不可能使用简单的 perl 代码来做到这一点。我使用 TEST::CSV 模块这样做
  • 您想使用什么语言?最好的办法可能是使用已经存在的 CSV 解析库。

标签: regex string csv split


【解决方案1】:

用于分隔字段的字符不应出现在字段本身中。如果可能,请将 , 替换为 ; 以分隔 csv 文件中的字段,这将使您的生活更轻松。但是如果你坚持使用, 作为分隔符,你可以使用这个正则表达式分割每一行:

/((?:[^,"]|"[^"]*")+)/

例如,在 Python 中:

import re
s = '10,"nikhil,khandare","sachin","rahul",viru'
re.split(r'((?:[^,"]|"[^"]*")+)', s)[1::2]
=> ['10', '"nikhil,khandare"', '"sachin"', '"rahul"', 'viru']

现在要得到问题中显示的准确结果,我们只需要删除那些多余的"字符:

[e.strip('" ') for e in re.split(r'((?:[^,"]|"[^"]*")+)', s)[1::2]]
=> ['10', 'nikhil,khandare', 'sachin', 'rahul', 'viru']

【讨论】:

  • 谢谢 :) 我相信在这种情况下这是适合这项工作的工具
【解决方案2】:

如果你真的总是有这样一个简单的结构,你可以在丢弃第一个数字和逗号后使用“,”(是的,带引号)分割

如果不是,您可以使用非常简单的state machine 形式从左到右解析您的输入。您将有两种状态:内部引号和外部。如果您已经知道正则表达式也是一种很好(并且更简单)的方法(因为它们基本上相当于状态机,只是以另一种形式)

【讨论】:

  • 使用状态机解析字符串。这就是大多数正则表达式引擎的工作方式,为什么不推荐使用正则表达式呢?
  • 看我的回答,我写了一个正则表达式,可以正确解析 OP 的输入
猜你喜欢
  • 2014-01-10
  • 2015-01-09
  • 2018-04-01
  • 2023-02-16
  • 2020-01-09
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多