2015-02-07 33 views
0

编辑文本CSV在python

我有文本输出变为形式:

SANFRAN
温度1 72
坎2 70
时间3 12:00
SANFRAN
Temp 1 74
Hum 2 68
时间3 12:01
SANFRAN
温度1 76
坎2 65
时间3 12:02

... FYI输出是任一市(例如SANFRAN)或 “”

,我希望写这个到csv,像这样:

SANFRAN,72,70,12:00
SANFRAN,74,68,12时01分
SANFRAN ,76,65,12:02

(这是原问题的简化版本)

我怎样才能读取每个行,然后通过FID ...然后writerow上SANFRAN每次出现.. 。作家将根据以上所需的输出顺序放置每个FID

当我在该行读取它是一个字符串,但我似乎无法将其拆分(“”)[然后我试着将文件读入一个csv,所以我得到一个列,而不是每行,但这不能成为pythonically做这个的方式] ...然后我可以做一个if/switch样式语句来挑选出这个行的FID为 =>但这一切都像是一次狗的晚餐!

我希望能指定一个模式作为(所有新行)中的文本确实遵循一个模式(虽然在我试图解析的实际文本中有时FID不存在于每个记录中 - 在这种情况下,我是要重复上述最后看到的值,或将两者的空白..或组合)

+1

是谷歌告诉你? – 2015-02-07 19:12:41

+1

有很多可能的解决方案,你可以提供你所尝试过的吗?即使你拥有的东西根本不起作用,它也会帮助我们理解你正在努力挣扎的具体代码/概念。真正的数据样本也会有所帮助。 – Fiver 2015-02-07 19:20:47

+0

一些代码和预期的输出将是一个很大的帮助 – 2015-02-07 19:45:08

回答

0

这不是最漂亮的解决方案,但我只是测试它!

import csv 

string = """SANFRAN 
Temp 1 72 
Hum 2 70 
Time 3 12:00 
SANFRAN 
Temp 1 74 
Hum 2 68 
Time 3 12:01 
SANFRAN 
Temp 1 76 
Hum 2 65 
Time 3 12:02""" 

strList = string.split('\n') 

#creates result.csv file to write results to 
f = csv.writer(open("result.csv", "wb+")) 
#writes header row 
f.writerow(["City", "Temp", "Hum", "Time"]) 

count = 1 
tempList = [] 
for x in strList: 
    temp = x.split(' ') 

    if(count == 1): 
     tempList.append(temp[0]) 
    else: 
     tempList.append(temp[2]) 

    #Completed csv row 
    if(count%4==0): 
     f.writerow([tempList[0],tempList[1],tempList[2], tempList[3]]) 
     tempList = [] 
     count = 0 
    count = count + 1 
+0

谢谢你......我希望能有一些更聪明的东西,可以识别(Field + FID + Value)的模式。也许这是不可能的,但?? – mbbxedh2 2015-02-08 13:52:23

+0

阿哈,更有活力的东西?你可以用更多的细节来编辑你的问题吗?你是说每行可能有多个值?它并不总是只有三个(Field-fieldID-value)? – ZAR 2015-02-08 13:54:45

+0

Hey Zar ...我想从长远的角度拉出一组可配置的字段......一组字段被写入一个csv文件,另一个定义的字段集合到另一个csv文件,剩下的字段被转储到一个第三个文件[不知道什么格式将是/将是最好的...我只想检查每个记录这​​些第三组字段匹配字段+ FID +值] – mbbxedh2 2015-02-08 14:10:28