使用基于字符串作为分隔符的 grepping 字段将文本转换为 CSV?
Text to CSV with grepping fields based on a string as delimiter?
我正在尝试组织非常长的联系人列表以便导入到 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.
基本上我需要从中拆分姓名、职位、公司、教育、社区和主要兴趣。有谁知道什么是好的方法?我在想第一行是名字,第二行是标题,第三行是公司,字符串 "COMMUNITY" 之前的行将是教育,"COMMUNITY" 和 "Key Interests" 之间的行将是现场社区,然后是“主要兴趣”字段。前 3 个字段在一行上,但困难的部分是有些字段是 multi-lines。如果它能让 grepping 更容易,每个字段都可以放在一行上。有没有人有想法 how/where 开始?我有一些小 scripting/programming 技能,但我肯定不是专业人士。
感谢任何帮助!
P.S 最终目标是以电子表格或可以导入数据库的类似格式组织数据。由于文本中有“,”,可能应该使用不同的分隔符,也许是制表符?
P.S.2 越想越觉得这个可以简化为first_name last_name title organization bio
。它不需要那么细化。我可以在下一个联系人之前放一个空行,它可以作为下一个联系人开始时的分隔符。
P.S.3 所以我能够通过 Copy/Paste Special 和 Transpose in Excel.It 获得我需要的东西,将每一行变成单独的 field/column。有没有一种简单的方法可以自动执行此操作?
您可以尝试使用这个肮脏的 perl 脚本。它使用 flip-flop
来检查 COMMUNITY
和 KEY 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."
由于我对 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()
我正在尝试组织非常长的联系人列表以便导入到 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.
基本上我需要从中拆分姓名、职位、公司、教育、社区和主要兴趣。有谁知道什么是好的方法?我在想第一行是名字,第二行是标题,第三行是公司,字符串 "COMMUNITY" 之前的行将是教育,"COMMUNITY" 和 "Key Interests" 之间的行将是现场社区,然后是“主要兴趣”字段。前 3 个字段在一行上,但困难的部分是有些字段是 multi-lines。如果它能让 grepping 更容易,每个字段都可以放在一行上。有没有人有想法 how/where 开始?我有一些小 scripting/programming 技能,但我肯定不是专业人士。
感谢任何帮助!
P.S 最终目标是以电子表格或可以导入数据库的类似格式组织数据。由于文本中有“,”,可能应该使用不同的分隔符,也许是制表符?
P.S.2 越想越觉得这个可以简化为first_name last_name title organization bio
。它不需要那么细化。我可以在下一个联系人之前放一个空行,它可以作为下一个联系人开始时的分隔符。
P.S.3 所以我能够通过 Copy/Paste Special 和 Transpose in Excel.It 获得我需要的东西,将每一行变成单独的 field/column。有没有一种简单的方法可以自动执行此操作?
您可以尝试使用这个肮脏的 perl 脚本。它使用 flip-flop
来检查 COMMUNITY
和 KEY 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."
由于我对 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()