需要使用正则表达式以不同方式格式化csv文件

时间:2011-10-06 15:07:52

标签: regex csv

我有一个我需要修改的csv文件,这里有一个片段:

1.1.1,"1, 8, 11, 13"
1.1.2,"10, 11, 12"
1.1.3,"2, 3, 10, 11, 13"

我想将其格式化为:

1.1.1,1
1.1.1,8
1.1.1,11
1.1.1,13
1.1.2,10
1.1.2,11
1.1.2,12
1.1.3,2
1.1.3,3
1.1.3,10
1.1.3,11
1.1.3,13

我在文本编辑器中使用搜索替换功能,启用正则表达式选项。

3 个答案:

答案 0 :(得分:1)

当引用部分中的值数量随着数据的变化而变化时,我无法想出匹配的方法,但如果没有太多变化,您可以使用类似这样的内容通过向“查找”部分添加,\s*(\d+)并向“替换”部分添加\n\1,\5几次来捕捉所有排列。

查找

([\d\.]+),"(\d+),\s*(\d+),\s*(\d+)"

替换:

\1,\2\n\1,\3\n\1,\4

这适用于示例的第二行的Notepad ++。

答案 1 :(得分:0)

如果您正在将该文件读入程序并在内存中对其进行操作,则Regex将仅对该文件起作用。为什么不写一个简单的转换器将文件转换成你想要的呢?

在伪代码中:

file = open("your.csv");
out = open("your_converted.csv")
for line in file.read()
    list = line.split(",") //split on the commas
    val1 = list[0]
    for i = 1 ; i < list.length-2 //2 because we removed the 1st value already and we start counting from zero.
        value = list[i]
        if value.contains("\"") 
            value = value.remove("\"")
        out.write(val1 + ","value + "\n")

显然你想要在使用后关闭文件等。

答案 2 :(得分:0)

我认为这里不需要使用正则表达式:正则表达式是not always解决问题的方法。

即使没有csv解析器,您也可以这样做,因为您的文件非常简单。

将它放在test.py文件中:

#!/usr/bin/env python
import sys

def main():
 for line in sys.stdin:
  if line.strip():
   fields = line.split(',', 1)
   for s in fields[1].split(','):
    print ','.join([fields[0], s.replace('"', '').strip()])


if __name__=='__main__':
 main()

然后只需:

$ cat yourfile.csv | test.py > newfile.csv

PS:执行前你可能需要 chmod + x python文件。