将 txt 文件转换为用制表符分隔的 csv

将 txt 文件转换为用制表符分隔的 csv

抱歉各位,我是 Linux 新手,虽然我浏览了已回答问题列表,但我不知道是否能确定我的问题是否得到了解答。或者我是否可以将其中一个答案应用于我的特定小问题。

我从老板那里得到一个文本数据文件,他学会了使用计算机的一种方式;他不会改变。数据几乎是一个 csv 文件,只是字段都是用空格字符而不是逗号或制表符分隔的。而且文本数据字段也包含嵌入的空格。

每个字段要么是数字,要么是数字和文本,所有字段的长度各不相同,并且没有一个字段用单引号或双引号隔开。数字字段占主导地位,并且没有一个文本字段与任何其他文本字段相邻。文本字段中嵌入的数字很少在前面或后面带有 [空格] 字符。

不幸的是,并不是每个 [空格] 字符都可以被替换。相反,因为通常字段分隔符的形式是 [空格][0-9] 或 [0-9][空格],所以我用这种方法来确定 [空格] 字符是否应该转换为 [制表符] 字符。如果 [空格] 字符在数字旁边,则将其转换为 [制表符] 字符。

因此,我使用 Windows 记事本中的“查找/替换”功能,搜索数字-空格或空格-数字组合,并将该 [空格] 字符转换为 [制表符] 字符。我必须这样做十次 [0-9][空格],然后再这样做十次 [空格][0-9]。我正在寻找一个可以自动执行此操作的脚本。

下面是我得到的文件示例。它包含四个字段,用 [空格] 字符分隔(第一行)。接下来的每一行都是一条记录,因此第二行是第一条记录。 Account2281Units19DescriptionToshiba PX-1982GRSUB{,最后该Delta字段包含0

Account Units Description Delta  
2281 19 Toshiba PX-1982GRSUB 0  
9618 200 HP MX19942-228b -25  
19246 4 CompuCom HD300g Hard Drive 4

因此,我正在寻找一个脚本,该脚本将读取原始文件,将作为字段分隔符的 [空格] 字符转换为字符,并将其全部写入新文件。我想要解释——这样我就不会一遍又一遍地问同样的问题。

答案1

好的,所以您需要用逗号替换每行的前两个空格和最后一个空格。您不能只替换每个空格,因为第 3 个字段本身可能包含空格。您可以使用正则表达式替换来执行此操作。这是一个有效的 sed 脚本/命令:

sed -re 's/^(\S*) (\S*) (.*) (\S+)\s*$/\1,\2,\3,\4/' in.txt > out.csv

对于上面的例子,返回结果为:

Account,Units,Description,Delta
2281,19,Toshiba PX-1982GRSUB,0
9618,200,HP MX19942-228b,-25
19246,4,CompuCom HD300g Hard Drive,4

如果除第三列以外的列包含空格,那么在处理空字段和分隔符时,这仍然非常脆弱。如果像你的老板那样手动格式化,则很容易引入这种格式错误的数据。你应该建议他切换到更强大的表格格式(例如适当的 CSV & Co.)和编辑器(常见的电子表格工具可以很好地灵活地处理 CSV,例如 LibreOffice/OpenOffice Calc、Microsoft Excel 和 Google Docs)。

答案2

在网上搜索“用逗号代替空格”很有收获,你一开始不是也这么想吗?会找到很多答案,比如

tr ' ' ',' < input > output

或者对于标签:

tr '\t' ',' < input > output

sed 's/\s\+/,/g' input > output

\s是空格类(如 [:space:]),也应该替换任何连续+的空格、制表符或换行符((转义)= 一个或多个前面的字符)。下一个只会用一个逗号替换每个单个空格或制表符(如运行上面的两个tr's):

sed 's/[ \t]/,/g' input > output

-ised

这是一个 sed,它将匹配空格-数字或数字-空格,并用逗号替换它们,使用 OR 命令/符号|转义,如下\|所示:

sed 's/ [0-9]\|[0-9] /,/g'

相关内容