使用 PySpark 、Python 或 Shell 解析多行 CSV
Parse multiple line CSV using PySpark , Python or Shell
输入(2 列):
col1 , col2
David, 100
"Ronald
Sr, Ron , Ram" , 200
Harry
potter
jr" , 200
Prof.
Snape" , 100
注意:Harry 和 Prof. 没有起始引号
输出(2 列)
col1 | col2
David | 100
Ronald Sr , Ron , Ram| 200
Harry potter jr| 200
Prof. Snape| 100
我尝试了什么 (PySpark)?
df = spark.read.format("csv").option("header",True).option("multiLine",True).option("escape","\'")
问题
上面的代码在 multiline 有开始和结束双引号的情况下工作正常(例如:以 Ronald 开头的行)
但它不适用于我们只有结束引号但没有开始引号的行(比如 Harry 和 Prof)
即使我们添加 Harry 和 Prof 的开始引号也能解决问题
欢迎任何使用 Pyspark、Python 或 Shell 等的想法!!
仅基于提供的小样本:
- 删除所有双引号
- 有两个comma-delimited字段;第一个字段是一个字符串,第二个字段是一个数字
- 第一个字段可能包含逗号,并且可能被分成多行
- 用竖线替换逗号分隔符 (
|
)
- OP 的预期输出与新插入管道之前的间距不一致 (
|
);有时删除 space,有时插入 space;现在我们不用担心间距
一个awk
想法:
awk -F, '
{ gsub(/"/,"") } # remove double quotes
FNR==1 || # if 1st line or last field is a number then ...
($NF+0)==$NF { print prev gensub(FS,"|",(NF-1)) # print any previous line(s) data plus current line, replacing last comma with a pipe
prev="" # clear previous line(s) data
next # skip to next line of input
}
{ prev= prev [=10=] " " } # if we get here then this is a broken line so save contents for later printing
' sample.csv
这会生成:
col1 | col2
David| 100
Ronald Sr, Ron , Ram | 200
Harry potter jr | 200
Prof. Snape | 100
输入(2 列):
col1 , col2
David, 100
"Ronald
Sr, Ron , Ram" , 200
Harry
potter
jr" , 200
Prof.
Snape" , 100
注意:Harry 和 Prof. 没有起始引号
输出(2 列)
col1 | col2
David | 100
Ronald Sr , Ron , Ram| 200
Harry potter jr| 200
Prof. Snape| 100
我尝试了什么 (PySpark)?
df = spark.read.format("csv").option("header",True).option("multiLine",True).option("escape","\'")
问题 上面的代码在 multiline 有开始和结束双引号的情况下工作正常(例如:以 Ronald 开头的行)
但它不适用于我们只有结束引号但没有开始引号的行(比如 Harry 和 Prof)
即使我们添加 Harry 和 Prof 的开始引号也能解决问题
欢迎任何使用 Pyspark、Python 或 Shell 等的想法!!
仅基于提供的小样本:
- 删除所有双引号
- 有两个comma-delimited字段;第一个字段是一个字符串,第二个字段是一个数字
- 第一个字段可能包含逗号,并且可能被分成多行
- 用竖线替换逗号分隔符 (
|
) - OP 的预期输出与新插入管道之前的间距不一致 (
|
);有时删除 space,有时插入 space;现在我们不用担心间距
一个awk
想法:
awk -F, '
{ gsub(/"/,"") } # remove double quotes
FNR==1 || # if 1st line or last field is a number then ...
($NF+0)==$NF { print prev gensub(FS,"|",(NF-1)) # print any previous line(s) data plus current line, replacing last comma with a pipe
prev="" # clear previous line(s) data
next # skip to next line of input
}
{ prev= prev [=10=] " " } # if we get here then this is a broken line so save contents for later printing
' sample.csv
这会生成:
col1 | col2
David| 100
Ronald Sr, Ron , Ram | 200
Harry potter jr | 200
Prof. Snape | 100