解析文本数据的问题

时间:2014-08-15 19:21:41

标签: python parsing

我有一个文本文件要解析并输出到csv。数据来自SSURGO土壤元数据(USDA)。我已将描述数据库表,列名和描述的pdf转换为文本文件,并希望转换为csv。

列值为:

Table Physical Name:
Table Label:
Column Physical name:
Column Label:
Desc:

有时,Column物理名称和列标签不包含说明。示例输入文件是:

Table Physical Name: chaashto
Table Label: Horizon AASHTO
Column Physical Name: aashtocl 
Column Label:   AASHTO
desc: Some description here.

并非每个列名称和标签都有相应的desc:或表物理名称和标签。

我使用以下代码解析数据,使每个列物理名称和标签都有一行:

count = 0
cnt = 0 
out = open("output_test.txt", "wb")
value1,value2,value3,value4,value5 = "","","","","" 
for i,line in enumerate(lines):

    key, value = line.strip().split(':',1)
    if key == 'Table Physical Name':
        value1 = value.strip()
    if key == 'Table Label':
        value2 = value.strip()
    if key == 'Column Physical Name':
        value3 = value.strip()
    if key == 'Column Label':
        value4 = value.strip()
        if not lines[i+1].strip().startswith('desc'):
            count = 1
    if key == 'desc':
        value5 = value.strip()
        count = 1
    if count == 1:
        cnt += 1
        record = value1 + ";" +value2 + ";" + value3 + ";" + value4 + ";" + value5 +";\n"
        print cnt, record
        out.write(record)
        count = 0
        value3 = " "
        value4 = " "
        value5 = " "
    out.close()  

(请原谅看起来很邋code的代码,只是学习Python)。

无论如何,问题在于,有时当输出一行时,它不包括列物理名称,并在该行的末尾插入\ r \ n。然后,后续行包括密钥"列物理名称:"列名称"

这是输出的外观:

chfrags;Horizon Fragments;chfragskey;Chorizon Fragments Key;A non-connotative string of characters used to uniquely identify a record in the Horizon Fragments table.;

这就是"坏"输出看起来:

coforprodo;Component Forest Productivity - Other; ;Low
Column Physical Name: fprod_r; ;

在上面的例子中," fprod_r"应该介于其他之间;和&#34 ;;低"和" \ r"之后;低不应该在那里。

令人抓狂的是,当我对输入文件进行子集化时,不再出现发生错误的位置。所以代码正确处理文本文件。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

无需手动执行所有 CSV ETL。 Python 有一个模块csv,你可以利用它,它应该有助于消除你遇到的那种边缘情况。

您可以尝试这样的事情:

import csv

with open('foo.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=',',
                            quotechar='"', quoting=csv.QUOTE_ALL)
    writer.writerow(('Table Physical Name', 'Table Label', 'Column Physical Name', 'Column Label', 'Desc'))
    writer.writerow( ('chfrags', 'Horizon Fragments', 'chfragskey', 'Chorizon Fragments Key',
                      'A non-connotative string of characters used to uniquely identify a record in the Horizon Fragments table.')
                   )

哪个输出:

"Table Physical Name","Table Label","Column Physical Name","Column Label","Desc"
"chfrags","Horizon Fragments","chfragskey","Chorizon Fragments Key","A non-connotative string of characters used to uniquely identify a record in the Horizon Fragments table."

您可能需要稍微调整此代码以满足您的确切数据需求(即分隔符,引用类型以及行元组的确切详细信息),但这应该提供一般模板,使用您上面提到的数据,供您使用。

答案 1 :(得分:0)

全部,我道歉。有"隐形" \ r \ n当我使用记事本++时没有出现。不知道为什么,但是当我最终删除它们时,输出是正确的。不确定为什么\ r没有被转移到子集文件中。哦,好吧。