使用基于字符串作为分隔符的grepping字段将文本转换为CSV?

时间:2015-01-29 16:29:47

标签: python csv text

我正在尝试组织很长的联系人列表以便在MySQL数据库中导入。示例如下所示:

John Doe                     
Manager
Some Company
B.A. in Sociology, Mary Washington College, M.Ed. in Human
Resources Development
COMMUNITY:
Library volunteer and reading tutor; Habitat for Humanity, Volunteer - Charity Works, Senior Women's Forum, Co-chair
KEY INTERESTS:
Transportation, Affordable housing.

基本上我需要将名称,头衔,公司,教育,社区和关键利益分开。有没有人知道什么是这个好方法?我想第一行作为名称,第二行作为标题,行第3行作为公司,排列为字符串" COMMUNITY"将是教育,社区"社区"和#34;主要兴趣"将是现场社区,然后是关键利益领域。前3个字段在一行上,但困难的部分是某些字段是多行。如果它可以使grepping更容易,每个字段可能在一行上。有谁知道如何/从哪里开始?我有一些小的脚本/编程技巧,但我当然不是专业人士。

感谢任何帮助!

P.S最终目标是以电子表格或类似格式组织数据,并将其导入数据库。因为有","在文本中,可能应该使用不同的分隔符,tab可能吗?

P.S.2我想的越多,就可以简化为first_name last_name title organization bio。它不需要那么精细。我可以在下一次联系之前添加一个空行,这可以是下一次联系开始时的分隔符。

P.S.3所以我能够通过Excel中的复制/粘贴特殊和转置来获得我需要的东西。它将每一行转换为一个单独的字段/列。有一种简单的方法可以实现自动化吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试使用这个脏脚本。它使用flip-flop检查COMMUNITYKEY INTERESTS之间的文本行,并将它们保存在一个数组中,以便在结尾处以分号连接。它用双引号括起来,因为有些行已经有分号,所以会让人感到困惑:

perl -lne '
    $. < 4 && do { push @data, $_; next };
    if ( $flipflop = (($. == 4) .. (/^COMMUNITY:/)) ) {
        if ( $flipflop =~ /E0\z/ ) {
            push @data, $data; undef $data; $line = $.;
        } else {
            $data .= $_ . " ";
        }
        next;
    }
    if ( $flipflop = (($line + 1 == $.) .. (/^KEY\s+INTERESTS:/)) ) {
        if ( $flipflop =~ /E0\z/ ) {
            push @data, $data; undef $data;
        } else {
            $data .= $_ . " ";
        }
        next;
    }
    $data .= $_;
    push @data, $data if eof();
    printf qq|"%s"\n|, join q|";"|, @data;
' infile

它产生:

"John Doe";"Manager";"Some Company";"B.A. in Sociology, Mary Washington College, M.Ed. in Human Resources Development ";"Library volunteer and reading tutor; Habitat for Humanity, Volunteer - Charity Works, Senior Women's Forum, Co-chair ";"Transportation, Affordable housing."

答案 1 :(得分:-1)

由于我对Perl知之甚少,所以我在研究Python。我通过更多地清理输入文本并将每个字段分成一个单独的行来实现它。以下是格式和程序。希望它可以帮到某人。

Name
Job Title
Company
Education
COMMUNITY
Some text
KEY INTERESTS
Some text

import csv
from itertools import islice

# Open the text file
with open("contacts.txt", "r") as infile:

    # Create the output CSV file
    result_file = open("contacts_output.csv", 'wb')
    wr = csv.writer(result_file, dialect='excel')

    # Iterate trough the text file
    while True:

        # Split into chunks of 9 lines
        next_n_lines = list(islice(infile, 9))

        # Exit if there are no more lines
        if not next_n_lines:
            break

        # Process next_n_lines and write into the CSV file
        wr.writerow(next_n_lines)

# Close handles
infile.close()
result_file.close()