我的输入看起来像"$130.00","$2,200.00","$1,230.63"
,依此类推
我的问题是如何将逗号分隔符更改为|分隔符没有删除实际输入中的逗号。
只是为了澄清这个输入是在一个包含40列和9500行的csv文件中。
我希望我的输出看起来像
"$130.00"|"$2,200.00"|"$1,230.63"
答案 0 :(得分:1)
如果您的文件中没有其他逗号,则可以使用:
sed "s/,/|/g" filename > outputfilename
如果逗号只在""
之间,那么:
sed 's/","/"|"/g' filename > outputfilename
像这样工作:
sh-3.1$ echo '"123,456","123,454"' |sed 's/","/"|"/g'
"123,456"|"123,454"
如果您仍然可以在输入中使用带引号的表达式","
而不想更改它,那么它会变得有点复杂,我认为:)
使用专用模块的Python的另一个解决方案,可能在安全性和所需代码方面最好:
import csv
inFilename = 'input.csv'
outFilename = 'output.csv'
r = csv.reader(open(inFilename))
w = csv.writer(open(outFilename,'w'), delimiter='|', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
w.writerows(list(r))
安全而简单。您可以轻松地将其调整为其他格式,参数相当简单。
答案 1 :(得分:1)
为了可靠地执行此操作,您必须使用状态来跟踪您是否在字符串内。以下perl脚本应该可以工作:
#!/usr/bin/perl -w
use strict;
use warnings;
my $state_outside_string = 0;
my $state_inside_string = 1;
my $state = $state_outside_string;
while (my $line = <>) {
my @chars = split(//,$line);
foreach my $char (@chars) {
if ($char eq '"') {
if ($state == $state_outside_string) {
$state = $state_inside_string;
} else {
$state = $state_outside_string;
}
} elsif ($char eq ',') {
if ($state == $state_outside_string) {
print '|';
next;
}
}
print $char;
}
}
答案 2 :(得分:1)
让shell运行Perl脚本吗?
如果是这样,我会看看Perl的Text::CSV模块。您有两个CSV句柄,一个用于读取文件,sep_char
属性设置为逗号(标准,默认),另一个用于写入文件,sep_char
属性设置为管道。< / p>
#!/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 ($!)";
"$130.00","$2,200.00","$1,230.63"
"EUR1.300,00",,
"GBP1,300.00","$2,200.00",
"$130.00"|"$2,200.00"|"$1,230.63"
"EUR1.300,00"||
"GBP1,300.00"|"$2,200.00"|
答案 3 :(得分:0)
Ruby的CSV库在1.9中被FasterCSV取代;在早期版本中,您可以使用fastercsv
gem。
#!/usr/bin/env ruby
require "csv"
output = CSV.read("test.csv").map do |row|
row.to_csv(:col_sep => "|")
end
puts output