#!/usr/bin/env perl
use strict;
use warnings;
use Text::CSV;
die "Usage: $0 in_file out_file\n" unless scalar @ARGV == 2;
my $in = Text::CSV->new({ binary => 1, blank_is_undef => 1 })
or die "Horribly";
my $out = Text::CSV->new({ binary => 1, sep_char => '|',
always_quote => 1, eol => "\n" })
or die "Horribly";
open my $fh_in, '<', $ARGV[0]
or die "Failed to open $ARGV[0] for reading ($!)";
open my $fh_out, '>', $ARGV[1]
or die "Failed to open $ARGV[1] for writing ($!)";
while (my $fields = $in->getline($fh_in))
{
$out->print($fh_out, $fields);
}
close $fh_in or die "Failed to close input ($!)";
close $fh_out or die "Failed to close output ($!)";
5条答案
按热度按时间v09wglhw1#
为了可靠地做到这一点,你必须使用状态来跟踪你是否在一个字符串中。下面的perl脚本应该可以工作:
taor4pac2#
让shell运行Perl脚本算不算?
如果是这样的话,我会看一下Perl的Text::CSV模块,你会有两个CSV句柄,一个用于阅读
sep_char
属性设置为逗号(标准,默认)的文件,另一个用于写入sep_char
属性设置为管道的文件。工作脚本
样品输入
输出示例
aemubtdh3#
如果文件中没有其他逗号,可以用途:
如果逗号仅在
""
s之间,则:工作原理如下:
如果你仍然可以在输入中使用像
","
这样的引用表达式,并且不想改变它,那么它会变得有点复杂,我认为:)另一个使用Python的解决方案是使用专用模块,可能在安全性和所需代码方面最好:
安全和简单。你可以很容易地为其他格式调整这个,参数相当简单。
dvtswwa34#
Ruby的CSV库在1.9中被替换为FasterCSV;在早期版本中,您可以使用
fastercsv
gem。arknldoa5#
我有同样的问题,我没有任何完美的解决方案,所以我尝试如下:
这将为传递给shell脚本的目录下的所有文件创建管道分隔的文件。这也处理了转义字符,该字符在一列中有额外的逗号。