linux 如何根据指定的行数拆分CSV文件?

qacovj5a  于 2023-02-03  发布在  Linux
关注(0)|答案(6)|浏览(374)

我有CSV文件(大约10,000行;每行有300列)存储在LINUX服务器上。我想打破这个CSV文件成500 CSV文件的20条记录每。(每一个有相同的CSV标题,因为目前在原来的CSV)
有没有linux命令可以帮助这个转换?

oxf4rvwz

oxf4rvwz1#

使用Linux拆分命令:

split -l 20 file.txt new

将文件“file.txt”拆分为以名称“new”开头的文件,每个文件包含20行文本。
在Unix提示符下输入man split以获取更多信息。但是,您必须首先从file.txt中删除头文件(例如,使用tail命令),然后将其添加回每个拆分的文件。

erhoui1w

erhoui1w2#

把它变成一个函数。你现在可以调用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

bzzcjhmw

bzzcjhmw3#

单行csv拆分器,在每个拆分文件中保留标题行。这个例子给你999行数据,每个文件一个标题行。

cat bigFile.csv | parallel --header : --pipe -N999 'cat >split_file_{#}.csv'

有关安装parallel的提示,请参阅https://stackoverflow.com/a/53062251/401226,其中的答案包含有关安装macos和Debian/Ubuntu的正确版本parallel的注解(在ubuntu中使用特定命名的parallel软件包,它比moreutils中捆绑的软件包更新)

5t7ly7z5

5t7ly7z54#

这个应该可以用!
file_name =要拆分的文件的名称。
10000 =每个拆分文件将包含的行数
file_part_ =分割文件名的前缀(文件_部件_0、文件_部件_1、文件_部件_2......等继续)
split -d -l 10000文件名.csv文件部分

at0kjp5o

at0kjp5o5#

这样就可以了--所有的文件都将被命名为Part1-Part 500。

#!/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
lh80um4z

lh80um4z6#

很多年前就有人问过这个问题,但对于未来的读者,我想提一下,用于此目的的最方便的工具是https://github.com/BurntSushi/xsv中的xsv
split子命令的作用与原始问题中所问的完全相同。

split - Split one CSV file into many CSV files of N chunks

每个拆分块都保留标题行。

相关问题