我们如何使用 python sdk 在 Apache Beam 中读取带附件的 CSV 文件?
How can we read CSV Files with enclosure in Apache Beam using python sdk?
我正在阅读一个逗号分隔的 CSV 文件,其中的字段用双引号括起来,其中一些字段的值中也有逗号,例如:"abc","def,ghi","jkl"
有没有办法使用 Apache Beam 将此文件读入 PCollection?
数据包含在双引号中的示例 csv 文件。
"AAA", "BBB", "Test, Test", "CCC"
"111", "222, 333", "XXX", "YYY, ZZZ"
您可以使用标准库中的 csv module:
def print_row(element):
print element
def parse_file(element):
for line in csv.reader([element], quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True):
return line
parsed_csv = (
p
| 'Read input file' >> beam.io.ReadFromText(input_filename)
| 'Parse file' >> beam.Map(parse_file)
| 'Print output' >> beam.Map(print_row)
)
这给出了以下输出
['AAA', 'BBB', 'Test, Test', 'CCC']
['111', '222, 333', 'XXX', 'YYY, ZZZ ']
需要注意的一件事是 csv.reader
对象需要一个 iterator
,它将 return iterator
个字符串。这意味着您不能将字符串直接传递给 reader()
,但可以像上面那样将它包含在 list
中。然后您将遍历输出以获得最终字符串。
我正在阅读一个逗号分隔的 CSV 文件,其中的字段用双引号括起来,其中一些字段的值中也有逗号,例如:"abc","def,ghi","jkl"
有没有办法使用 Apache Beam 将此文件读入 PCollection?
数据包含在双引号中的示例 csv 文件。
"AAA", "BBB", "Test, Test", "CCC"
"111", "222, 333", "XXX", "YYY, ZZZ"
您可以使用标准库中的 csv module:
def print_row(element):
print element
def parse_file(element):
for line in csv.reader([element], quotechar='"', delimiter=',', quoting=csv.QUOTE_ALL, skipinitialspace=True):
return line
parsed_csv = (
p
| 'Read input file' >> beam.io.ReadFromText(input_filename)
| 'Parse file' >> beam.Map(parse_file)
| 'Print output' >> beam.Map(print_row)
)
这给出了以下输出
['AAA', 'BBB', 'Test, Test', 'CCC']
['111', '222, 333', 'XXX', 'YYY, ZZZ ']
需要注意的一件事是 csv.reader
对象需要一个 iterator
,它将 return iterator
个字符串。这意味着您不能将字符串直接传递给 reader()
,但可以像上面那样将它包含在 list
中。然后您将遍历输出以获得最终字符串。