繁体   English   中英

使用拆分创建 csv 时,如何添加变量以打开文件 stream?

[英]How do I prepend variable to open file stream when using split to create csv's?

I have a bash file that takes a large csv and splits the csv into smaller csv's based on this bloghttps://medium.com/swlh/automatic-s3-file-splitter-620d04b6e81c . 它运行良好,因为它从不下载 csv,这对于 lambda 来说非常有用。 拆分后的 csv 没有标头,只有原始 csv。 This is problem for me since I am not able to read with apache pyspark a set of files one with header row and many other files without header rows.

我想在每个写入的 csv 中添加一个 header 行。

代码的作用

文件

  • “s3//测试桶/test.csv”

OUTFILES - 分成 300K 行

  • “s3//dest-test-bucket/test.00.csv”
  • “s3//dest-test-bucket/test.01.csv”
  • “s3//dest-test-bucket/test.02.csv”
  • “s3//dest-test-bucket/test.03.csv”

有效的原始代码

LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"

FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "aws s3 cp - \"${OUTFILE}_\$FILE.csv\"  | echo \"\$FILE.csv\""))

这是我尝试将变量添加到传出文件 stream 中,但没有成功。

LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"

HEADER=$(aws s3 cp "${INFILE}" - | head -n 1)

FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "echo ${HEADER}; aws s3 cp - \"${OUTFILE}_\$FILE.csv\"  | echo \"\$FILE.csv\""))

尝试2:

LINECOUNT=300000
INFILE=s3://"${S3_BUCKET}"/"${FILENAME}"
OUTFILE=s3://"${DEST_S3_BUCKET}"/"${FILENAME%%.*}"

HEADER=$(aws s3 cp "${INFILE}" - | head -n 1)

FILES=($(aws s3 cp "${INFILE}" - | split -d -l ${LINECOUNT} --filter "{ echo -n ${HEADER}; aws s3 cp - \"${OUTFILE}_\$FILE.csv\"; } | echo \"\$FILE.csv\""))

AWS 文档状态

您可以使用 dash 参数将文件流式传输到标准输入 (stdin) 或标准 output (stdout)。

我不知道这是否可以通过打开的文件 stream 实现。

希望这可以帮助。 我认为您只是缺少添加 header 的cat方面。

本文展示了一种拆分文件并使用split命令和filter arguments 提供 header 的方法。

使用该片段并将其应用于上面的代码似乎可行。 请注意,花括号内的 2 个命令是echo ${HEADER}cat 第一个, echo在 stdout 上创建 header,然后第二个, cat将 pipe aws cp stdin 到 stdout,这是aws cp -在 S3 上创建新文件。

HEADER='"Name", "Team", "Position", "Height(inches)", "Weight(lbs)", "Age"'

aws s3 cp ${INFILE} - | split -d -l ${LINECOUNT} --filter "{ echo ${HEADER} ; cat; } | aws s3 cp - \"${OUTFILE}\$FILE.csv\""

运行命令后,我观察到 3 个新文件,每个文件都有所需的 header。


head -n 1 *.csv
==> x00.csv <==
Name, Team, Position, Height(inches), Weight(lbs), Age

==> x01.csv <==
Name, Team, Position, Height(inches), Weight(lbs), Age

==> x02.csv <==
Name, Team, Position, Height(inches), Weight(lbs), Age

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM