我有一个txt
格式的文件,我想将其转换为csv
. 每个字段之间都有空格块。每个字段之间的空格数量并不相同。
是否有使用 sed 或 awk 的命令将具有 3 个或更多空格的块替换为,
. 如果只有 2 个空格,则需要忽略它,以避免数据中的双空格被替换为,
输入:
A_DRIVERLICENSENUMBER_ A_PRIORADDRESS2_ A_MONTHLYRENT_ A_EMPLOYEEID_ A_WORKPHONESPECIALINSTR_ A_REFDETAIL_ A_VERBALPLEDGE
input example,input2 example
输出:
A_DRIVERLICENSENUMBER_,A_PRIORADDRESS2_,A_MONTHLYRENT_,A_EMPLOYEEID,A_WORKPHONESPECIALINSTR_,A_REFDETAIL_,A_VERBALPLEDGE
input example,input2 example
我在互联网上找不到如何执行此操作。我确信这里有人可以帮助我
你可以试试:
或者
使用Raku(以前称为 Perl_6)
上面的 Raku 代码与 Perl 答案类似,但语法略有变化,因为 Raku 使用符号枚举字符(或字符类)的重复实例
** min..max
。这允许{}
为正则表达式中的可执行代码保留大括号(对于运行计数器变量等有用)。输入示例:
示例输出:
对于“simple-CSV”格式以外的任何格式,您可能希望将
> ./tmp
输出重定向到tmp
文件,然后使用 Raku 的Text::CSV
模块来解析该文件。TSV
下面,从文件创建文件CSV
(注意带有内部空格的列式输出正确地用双引号引起来):对于最终的代码示例(上面),删除
sep => "\t"
参数,代码将,
默认使用逗号,为您提供一个CSV
文件。https://raku.land/github:Tux/Text::CSV
https://docs.raku.org/language/regexes
https://raku.org
从示例文件开始,您可以使用Miller 6并运行
要得到
一些注意事项:
--ifs-regex " +"
您设置 3 个或更多空格作为字段分隔符;ragged
,如果数据行的字段少于标题行,则用空字符串填充剩余的键。如果数据行的字段多于标题行,请使用整数字段标签,如隐式标头情况如果您想删除最后一个空白字段
如果在第 2 行中
,
首先是字段分隔符,您应该标准化所有内容 - 具有相同的分隔符 - 并将输出传递给 Miller输出是带有适量字段分隔符的正确 csv
使用任何 POSIX awk:
或使用任何 awk 硬编码 3 个空格,然后使用 a
+
表示 FS:如果您想要有效的 CSV 输出(每行的字段数相同),假设第一行包含所有字段:
或者:
取决于
,
输入中现有的 s 是否应该被视为字段分隔符。假设您确实只想更正标题,则可以用逗号替换第一行上所有类似空格的字符:
要同时删除可能不需要的尾随逗号:
这些
sed
命令仅修改输入数据的标题行,假定该标题行是输入的第一行。其余数据保持不变。sed
最后一个命令的几乎字面翻译awk
如下:...但它可以缩短为以下内容,我们通过将
awk
第一行拆分为空白字符来将其重新格式化为逗号分隔的记录:在这两种情况下,我们都避免修改除第一行之外的任何其他输入行。