2016-05-10 7 views
-1

У меня есть рабочий скрипт, который анализирует файл CSV, счищает данные и вносит некоторые изменения, прежде чем снова объединить их. Исходный файл, с которым я работал, был разделен запятой. Но я только что получил все фактические файлы, с которыми это будет работать, и все они разделены по каналам. Мне нужно сделать то же самое, а затем вернуть их вместе в виде файлов с разделителями-запятыми.От границы, разделенной запятыми?

Итак, чтобы начать, у меня есть -

#!/usr/bin/perl/ 

use strict; 
use warnings; 
use Data::Dumper; 
use Time::Piece; 

my $filename = 'records.csv'; 

open my $FH, $filename 
    or die "Could not read from $filename <$!>, program halting."; 

# Read the header line. 
chomp(my $line = <$FH>); 
my @fields = split(/|/, $line); 
print Dumper(@fields), $/; 

my @data; 
# Read the lines one by one. 
while($line = <$FH>) { 

    chomp($line); 

... разобрать через мои данные, а затем в настоящее время, я заканчиваю с этим, чтобы поместить данные обратно в файл -

# put the records back 
    push @data, \@fields; 

Но как мне вернуть данные в виде запятой?

+0

Я предполагаю, что это просто некорректная копия, но 'split (/ | /, $ line);' должен быть 'split (/ \ | /, $ line);' – ThisSuitIsBlackNot

+2

* "Мне нужно сделать то же самое , затем верните их вместе как файлы с разделителями-запятыми "* Нет, вы этого не сделаете, вам просто нужно разделить данные на каналы вместо запятых и продолжить как обычно. Пожалуйста, не пытайтесь сначала воссоздать свой «ожидаемый» входной файл с реального, так как вы представите совершенно новый слой ошибок. – Borodin

+0

Спасибо @ThisSuitIsBlackNot - на самом деле я быстро бросил трубку вместо запятой, которая изначально была там - Не знал, что мне нужен побег! – BigRedEO

ответ

1

Несколько вещей. Во-первых, исправьте свой shebang (линия #!), поэтому он не содержит трейлинг-код /.

Во-вторых, Perl использует регулярные выражения для расщепления, так что вы хотите, чтобы избежать персонажа трубы при разбиении:

my @fields = split(/\Q|\E/, $line); 

Наконец, вы можете использовать join соединить элементы массива в строку. Это использует строковый литерал, а не регулярное выражение.

my $output_line = join(',', @fields); 
+0

У вас есть переменная $ output_line для возврата данных. Как это будет работать, чтобы записать его в тот же файл? Или нужно перейти к другому имени файла? – BigRedEO

+4

'split (/ \ Q | \ E /, $ line)' обычно записывается 'split/\ | /, $ line' – Borodin

2

Не разбирайте CSV-файл, используя split. Используйте правильный парсер.

use strict; 
use warnings 'all'; 
use autodie; 
use Text::CSV_XS; 

my $csv_in = Text::CSV_XS->new({ binary => 1, sep_char => "|" }); 
my $csv_out = Text::CSV_XS->new({ binary => 1, sep_char => ",", eol => $/ }); 
while (my $row = $csv_in->getline(*ARGV)) { 
    $csv_out->print(*STDOUT, $row); 
} 

Если это правда, вам просто нужно изменить трубу разделителей запятой разделителей, вставьте tr '|' ',' в вашу трубу.

+0

Мой скрипт уже работал как есть. Просто теперь у меня есть файл с разделителями каналов, и его нужно очистить и вернуть вместе в виде файла с разделителями-запятыми. Текст :: CSV недоступен для меня, и он не будет доступен мне. У меня есть работы. Мне просто нужно учесть трубы. – BigRedEO