2011-10-06 78 views
1

我有需要修改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 

我正在使用文本編輯器中的搜索替換功能,啓用了正則表達式選項。

+0

爲什麼是正則表達式?爲什麼不是CSV解析器? –

+2

你可以通過* sed * – lynks

+0

@tim我應該使用什麼csv解析器,我將如何解決我的問題? – Brad

回答

1

我想不出一種方法來匹配引用部分中的值的數量隨數據的變化而變化,但如果沒有太多變化,您可以使用類似這樣的東西,將,\s*(\d+)添加到查找部分並將添加到替換部分幾次以捕獲所有排列。

查找:

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

替換:

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

這個工程在記事本++爲您的示例的第二行。

0

正則表達式只對文件有效,如果你將它讀入程序並在內存中進行操作。爲什麼不寫一個簡單的轉換器將文件翻譯成你想要的?

在僞代碼:

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") 

顯然你要關閉文件和使用等之後。

+0

我正在使用文本編輯器中的搜索替換功能,啓用了正則表達式選項。 – Brad

0

我在這裏看不到正則表達式的用法:regex是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蟒蛇文件執行前。

+0

創建standards.csv,運行python 2.6.1,出現錯誤,如http://cl.ly/AjVh所示 - 標準已讀/寫訪問 – Brad

+0

您應該在shell中運行「cat ...」,而不是在python解釋器:) –