我已经将CSV文件(大约10,000行;每行具有300列)存储在LINUX服务器上。我想将此CSV文件分解为500个CSV文件,每个文件20条记录。(每个具有与原始CSV中相同的CSV标头)
有什么linux命令可以帮助这种转换吗?
我已经将CSV文件(大约10,000行;每行具有300列)存储在LINUX服务器上。我想将此CSV文件分解为500个CSV文件,每个文件20条记录。(每个具有与原始CSV中相同的CSV标头)
有什么linux命令可以帮助这种转换吗?
Answers:
使其成为一个函数。您现在可以打电话splitCsv <Filename> [chunkSize]
splitCsv() {
HEADER=$(head -1 $1)
if [ -n "$2" ]; then
CHUNK=$2
else
CHUNK=1000
fi
tail -n +2 $1 | split -l $CHUNK - $1_split_
for i in $1_split_*; do
sed -i -e "1i$HEADER" "$i"
done
}
发现于:http : //edmondscommerce.github.io/linux/linux-split-file-eg-csv-and-keep-header-row.html
split
,然后将其分割成每20行长的带有前缀split_
2的新文件:遍历新的split_ *文件,将每个名称file
一次存储到变量中3:每个... 4:将原始文件的第一行(列标题)写到tmp_file
5:将20行拆分文件追加到tmp_file
6:用new覆盖旧的split_ *文件tmp_file
,因此保留列标题
echo -e "$HEADER\n$(cat $i)" > $i
不必要地不正确。我将其替换为sed -i -e "1i$HEADER" "$i"
。
使用Linux split命令:
split -l 20 file.txt new
将文件“ file.txt”拆分为以“ new”开头的文件,每个文件包含20行文本。
man split
在Unix提示符下键入以获取更多信息。但是,您必须首先从file.txt中删除标题(tail
例如,使用命令),然后再将其重新添加到每个拆分文件中。
wc -l
获取行数,然后将该值减去1(假设wc -l
为50),然后运行tail -n 49
(在此示例中)以获取除标题行以外的所有内容。请注意,该wc -l
字符计数<newline>,因此如果最后一行未以换行符结尾,则行数将减少1。
tail -n +2
将打印除第一行外的所有行。
--additional-suffix=.csv
这应该工作!
file_name
=您要分割的文件名。
10000
=每个拆分文件将包含的行数
file_part_
=拆分文件名的前缀(file_part_0,file_part_1,file_part_2..etc继续存在)
分割-d -l 10000 file_name.csv file_part_
head -200000 file.csv | split -l 10000 - new_
这应该为您完成-您的所有文件最终都将称为Part1-Part500。
#!/bin/bash
FILENAME=10000.csv
HDR=$(head -1 $FILENAME) # Pick up CSV header line to apply to each file
split -l 20 $FILENAME xyz # Split the file into chunks of 20 lines each
n=1
for f in xyz* # Go through all newly created chunks
do
echo $HDR > Part${n} # Write out header to new file called "Part(n)"
cat $f >> Part${n} # Add in the 20 lines from the "split" command
rm $f # Remove temporary file
((n++)) # Increment name of output part
done
我有一个一线回答(此示例为您提供999行数据,每个文件一个标题行)
cat bigFile.csv | parallel --header : --pipe -N999 'cat >file_{#}.csv'