如何使用Linux分隔CSV文件 (linux分隔csv文件)

CSV文件(Comma Separated Values)是一种常用的电子表格文件格式,常用于数据导入和导出。在数据量较大的情况下,往往需要对CSV文件进行分隔处理。Linux是一种功能强大、免费开源的操作系统,具有丰富的命令行工具,通过这些工具可以轻松地对CSV文件进行分隔。本文将介绍。

1. 安装和配置CSVKit

CSVKit是一个强大的命令行工具,用于处理CSV文件,可在Linux、macOS和Windows上运行。安装CSVKit需要使用pip包管理器,在终端中输入以下命令:

“`

$ pip install csvkit

“`

待安装完成后,输入以下命令练习:

“`

$ csvclean -n filename.csv

“`

如果以上命令可以成功输出CSV文件中所有字段名称,则表示CSVKit已成功安装和配置。

2. 导出CSV文件

在Linux中,常用的电子表格文件格式是xlsx和ods等。如果要使用CSVKit对电子表格文件进行CSV格式导出,可以使用以下命令:

“`

$ in2csv input.xlsx > output.csv

“`

以上命令将导出input.xlsx文件中的所有数据,并将其保存为output.csv文件。如果文件路径错误,则命令将无法执行。

3. 分隔CSV文件

使用CSVKit分隔CSV文件通常需要使用csvcut和csvjoin命令。下面分别介绍这两种命令的使用方法。

csvcut命令用于分隔CSV文件的列,可使用以下命令:

“`

$ csvcut -c 1,3 input.csv > output.csv

“`

以上命令将input.csv文件(包含多个列)中的第1列和第3列提取出来,并将它们保存为output.csv文件。如果文件路径错误,则命令将无法执行。

csvjoin命令用于分隔CSV文件的行,可使用以下命令:

“`

$ csvjoin -c 1 file1.csv file2.csv > output.csv

“`

以上命令将file1.csv文件和file2.csv文件中的行组合在一起,并将其保存为output.csv文件。如果需要选择不同的列进行组合,可以使用-c选项指定。

4. 其他注意事项

在使用CSVKit分隔CSV文件时,需要注意以下几点:

– CSV文件首行为字段名称,只有CSVKit能够处理这种情况;

– CSV文件中不应该包含与字段名称相同的数据;

– 编码问题:如果CSV文件中有包含Unicode字符或非英文字符的数据,需要将文件编码方式改为utf-8或utf-16等。

使用Linux分隔CSV文件可以让数据处理更加高效、快速和方便。CSVKit是一个功能强大的命令行工具,能够轻松处理CSV文件。在使用CSVKit分隔CSV文件时,需要注意CSV文件的格式、编码、字段名称等问题。通过本文介绍的方法,相信大家可以轻松地处理CSV文件,提高数据分析和处理效率。

相关问题拓展阅读:

Linux里面分割,切片是什么?

在Linux最常用的文件生成和切片工具是dd,它功能比较全面,但无法以行为单位提取文件数据,也无法直接将文件按大小或行数进行均分(除非借助循环)。另两款数据分割工具split和csplit能够比较轻松地实现这些需求。csplit是split的升级版。

1.1 dd命令

从if指定的文件读取数据,写入到of指定的文件。使用bs指定读取和写入的块大小,使用count指定读取和写入的数据块数量,bs和count相乘就是文件总大小。可以指定skip忽略读卜闹取if指定文件的前多少个块,seek指定写入到of指定文件时忽略前多少个块。型颂罩

dd if=/dev/zero of=/tmp/abc.1 bs=1M count=20

if是input file,of是output file;bs有c(1byte)、w(2bytes)、b(512bytes)、kB(1000bytes)、K(1024bytes)、MB(1000)、M(1024)和GB、G等几种单位。因此,不要随意在单位后加上字母B。

假设现有文件CentOS.iso的大小1.3G,需要将其切分后还原,切分的之一个小文件大小为500M。

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M count=250

生成第二个小文件,由于第二个小文件不知道具体大小,所以不指定count选项。由于第二个小文件要从第500M处开始切分,于是需要忽略CentOS.iso的前500M。假设bs=2M,于是skip掉的数据块数量为250。

dd if=/tmp/CentOS.iso of=/tmp/CentOS2.iso bs=2M skip=250

现在CentOS.iso=CentOS1.iso+CentOS2.iso。可以将CentOS.iso还原。

cat CentOS1.iso CentOS2.iso >CentOS_m.iso

比较CentOS_m.iso和CentOS.iso的md5值,它们是完全一样的。

shell> md5sum CentOS_m.iso CentOS.iso

504dbef14aed9bf85d9fdc667 CentOS_m.iso

504dbef14aed9bf85d9fdc667 CentOS.iso

那么seek选项呢?和skip有什么区别?skip选项是忽略读取时的前N个数据块,而seek是忽略写入文件的前N个数据块。假如要写入的文件为a.log,则seek=2时,将从a.log的第3个数据块开始追加数据,如果a.log文件本身大小就不足2个数据块,则缺少的部分自动使用/dev/zero填充。

于是,在有了CentOS1.iso的基础上,要将其还原为和CentOS.iso相同的文件,可以使用下面的方法:

dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M skip=250 seek=250

还原后,它们的md5值也是相同的。

shell>md5sum CentOS1.iso CentOS.iso

504dbef14aed9bf85d9fdc667 CentOS1.iso

504dbef14aed9bf85d9fdc667 CentOS.iso

1.2 split命令

split工具的功能是将文件切分为多个小文件。既然要生樱漏成多个小文件,必然要指定切分文件的单位,支持按行切分以及按文件大小切分,另外还需解决小文件命名的问题。例如,文件名前缀、后缀。如果未明确指定前缀,则默认的前缀为”x”。

以下是命令的语法说明:

例如,将/etc/fstab按行切分,每5行切分一次,并指定小文件的前缀为”fs_”,后缀为数值后缀,且后缀长度为2。

# split -l 5 -d -a 2 /etc/fstab fs_

# lsfs_00 fs_01 fs_02

查看任一小文件。

# catfs_01

# Accessible filesystems, by reference, are maintained under’/dev/disk’# Seeman pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#

UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults 0 0UUID=367d6a77-033b-4037-bbcbead095 /boot xfs defaults 0 0

可以将这些切分后的小文件重新组装还原。例如,将上面的三个小文件还原为~/fstab.bak。

# cat fs_0 >~/fstab.bak

还原后,它们的内容是完全一致的。可以使用md5sum比较。

# md5sum /etc/fstab ~/fstab.bak

29b94c500f484040a675cb4ef81c87bf/etc/fstab

29b94c500f484040a675cb4ef81c87bf/root/fstab.bak

还可以将标准输入的数据进行切分,并分别写入到小文件中。例如:

# seq| split -l 3 -d -new_

# ls new*new_00 new_01 new_02

可以为每个小文件追加额外的后缀。有些老版本的split不支持该选项,而是在csplit上支持的,但是新版本的split已经支持。例如,加上”.log”。

# seq| split -l 3 -d -a 3 –additional-suffix=”.log” -new1_

# ls new1*new1_000.log new1_001.log new1_002.log new1_003.log

1.3 csplit命令

split只能按行或按照大小进行切分,无法按段落切分。csplit是split的变体,功能更多,它主要是按指定上下文按段落分割文件。

csplit … FILE PATTERN…

描述:按照PATTERN将文件切分为”xx00″,”xx01″, …,并在标准输出中输出每个小文件的字节数。

选项说明:-b FORMAT:指定文件后缀格式,格式为printf的格式,默认为%02d。表示后缀以2位数值,且不足处以0填充。-f PREFIX:指定前缀,不指定是默认为”xx”。-k:用于突况。表示即使发生了错误,也不删除已经分割完成的小文件。-m:明确禁止文件的行去匹配PATTERN。-s:(silent)不打印小文件的文件大小。-z:如果切分后的小文件中有空文件,则删除它们。

FILE:待切分的文件,如果要切分标准输入数据,则使用”-“。

PATTERNs:

INTEGER :数值,假如为N,表示拷贝1到N-1行的内容到一个小文件中,其余内容到另一个小文件中。/REGEXP/:从匹配到的行开始按照偏移量拷贝指定行数的内容到小文件中。

:其中OFFSET的格式为”+N”或”-N”,表示向后和向前拷贝N行%REGEXP%:匹配到的行被忽略。

{INTEGER} :假如值为N,表示重复N此前一个模式匹配。

{*} :表示一直匹配到文件结尾才停止匹配。

假设文件内容如下:

# cattest.txt

SERVER-1192.168.0.1success

192.168.0.2failed

192.168.0.3pending

192.168.0.4success

SERVER-2192.168.0.1failed

192.168.0.2failed

192.168.0.3success

192.168.0.4pending

SERVER-3192.168.0.1pending

192.168.0.2pending

192.168.0.3pending

192.168.0.4 failed

假设每个SERVER-n表示一个段落,于是要按照段落切分该文件,使用以下语句:

# csplit -f test_ -b %04d.log test.txt /SERVER/ {*}0

140

139

140

“-f test_” 指定小文件前缀为”test_”, “-b %04d.log” 指定文件后缀格式”00xx.log”,它自动为每个小文件追加额外的后缀”.log”, “/SERVER/” 表示匹配的模式,每匹配到一次,就生成一个小文件,且匹配到的行是该小文件中的内容, “{*}” 表示无限匹配前一个模式即/SERVER/直到文件结尾,假如不知道{*}或指定为{1},将匹配一次成功后就不再匹配。

# ls test_*test_0000.log test_0001.log test_0002.log test_0003.log

上面的文件中虽然只有三个段落:SERVER-1,SERVER-2,SERVER-3,但切分的结果生成了4个小文件,并且注意到之一个小文件大小为0字节。为什么会如此?因为在模式匹配的时候,每匹配到一行,这一行就作为下一个小文件的起始行。由于此文件之一行”SERVER-1″就被/SERVER/匹配到了,因此这一行是作为下一个小文件的内容,在此小文件之前还自动生成一个空文件。

生成的空文件可以使用”-z”选项来删除。

# csplit -f test1_ -z -b %04d.log test.txt /SERVER/ {*}140

139

140

还可以指定只拷贝匹配到的行偏移数量。例如,匹配到行时,只拷贝它后面的1行(包括它自身共两行),但多余的行将放入下一个小文件中。

# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}42

139

140

之一个小文件只有两行。

# cattest2_0000.log

SERVER-1192.168.0.1 success

SERVER-1段落的其余内容放入到了第二个小文件中。

# cattest2_0001.log

192.168.0.2failed

192.168.0.3pending

192.168.0.4success

SERVER-2192.168.0.1 failed

同理第三个小文件也一样,直到最后一个小文件中存放剩余所有无法匹配的内容。

# cattest2_0003.log

192.168.0.2pending

192.168.0.3pending

192.168.0.4 failed

指定”-s”或”-q”选项以静默模式运行,将不会输出小文件的大小信息。

# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}linux分隔csv文件的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux分隔csv文件,如何使用Linux分隔CSV文件,Linux里面分割,切片是什么?的信息别忘了在本站进行查找喔。


数据运维技术 » 如何使用Linux分隔CSV文件 (linux分隔csv文件)