什么是用于编写csv的块解析数据的简单模式?

时间:2015-01-29 21:28:39

标签: python-2.7 parsing export-to-csv libreoffice-calc

我在一个大型XML文件(~700k行)中有几年的数据,我用Beautiful Soup解析过,然后用csv.writer()写入CSV。只是,现在我在电子表格应用程序(LibreOffice)中预览长文本值时遇到了问题。

目标。对文本进行分块并将其与每个文本的相关日期配对。

输入: ' date' ' text' 元素来自XML树。日期文本不言自明,文本元素值约为 5-10k字

输出元组列表。 text元素由静态字数分块。 每个块与其原始日期值配对,有效地为最终CSV中的每个日期创建多个记录。例如:

[(date1, "text1...."),(date1, "text2...."),(date1,"text3...."), ... (daten,"text1..."),(daten,"text2...")]

每个日期的多个记录都可以,因为分析是在单词/标记级别,而不是句子/段落级别 - 顺序并不重要

尝试使用n的值,我可以更好地控制我在数据上使用的各种应用程序的行长度。无论解决方案是什么,显然它都会在BeautifulSoup的findAll()输出之后或之后发生#text;'在csv.writer()之前 - 自然而然。

目前,将日期列表和文本列表及zip()组合在一起非常简单,因为它们都是相同大小的列表。此设计创建了两个不同大小的列表,因此我需要在分块步骤中插入date

用于编写csv和维护日期 - 文本关系的块解析数据的简单和优雅模式是什么?

//我已经重写了这个问题,以更明确地命名输入&输出。

1 个答案:

答案 0 :(得分:1)

我建议python's generators。这允许您创建可以链接在一起的操作“管道”。每个步骤都可以做一件事,您可以根据需要添加其他步骤。

例如(Psuedocode):

def getTags():
tags = Beautifulsoup.find_all()
for tag in tags:
    yeild (date, tag)

def splitText(input):
    for (date, text) in input:
        for t in text.split("."):
            yield (date, t)

def writeLines(input):
    for line in input:
        csv.write(line)

tags = getTags()
lines = getLines(tags)
writeLines(lines)

我个人喜欢这个布局。