Может кто-нибудь сказать мне, где ошибка? - PullRequest
0 голосов
/ 21 июля 2011
             use strict;
             use warnings;
             open(FILE4,"cool.txt");
             open(FILE6,">./mool.txt");
             $line = <FILE4>;
               while ($line ne "")
             {
                @array = split(/,/,$line);
                $line = <FILE4> ;
                print FILE6 ($array[0]);
                print FILE6 ("\t");
                print FILE6 ($array[1]);
                print FILE6 ("\t");
                print FILE6 ($array[2]);
             }

Это код, который я написал на Perl.Но код не работает нормально.Это дает место для вкладки для каждой следующей строки.Но мне не нужно это пространство табуляции для каждой новой строки. Позвольте мне показать вам, как вывод.

          name         contact        email
                       samy            32344245            hyte@some.com
                       alex            231414124           coool@some.com   

Вот как я вижу мой файл mool.txt. Первая строка работает нормально. Но изследующая строка, с которой я сталкиваюсь. Вкладка. Я пытаюсь выяснить, где находится ошибка. Может кто-нибудь сообщить мне, где код работает неправильно? Я прошел через это много раз, но не смог понять. Спасибо

Как кто-то спросил, я показываю вам входной файл

        "name","contact","email"
        "samy","32344245","hyte@some.com"

Ответы [ 3 ]

4 голосов
/ 21 июля 2011

Возможно, у вас есть пробел в начале / конце строк во входном файле.
Попробуйте удалить его с помощью s///:

use strict;
use warnings;

open my $in, "<", "cool.txt" or die $!;
open my $out, ">", "mool.txt" or die $!;

while (my $line = <$in>) {
    $line =~ s/^\s+|\s+$//g;                    
    my @array = split(/,/, $line);
    print $out join("\t", @array), "\n";
}     
2 голосов
/ 21 июля 2011

То, что вы, похоже, делаете, - это изменение этого файла с запятой-разделителем на символ табуляции. Если это так, это может быть более простой способ сделать это:

while (<>) {
    s/,/\t/g;
    print;
}

А затем используйте это так:

$ script.pl cool.txt > mool.txt

Вы могли бы даже уйти с однострочником:

perl -pwe 's/,/\t/g' cool.txt > mool.txt

Или, если у вас странные пробелы:

perl -pwe 's/^\s+|\s+$//g; s/,/\t/g' cool.txt > mool.txt

Или, более безопасная версия, используя Text :: CSV . Это будет обрабатывать сложные данные и тому подобное для вас. Если вы получите пустой вывод, это может быть лишние пробелы. Если это так, вы можете запустить приведенную выше строку без строки s/,/\t/g, чтобы получить «очищенную» версию входного файла:

perl -pwe 's/^\s+|\s+$//g;' cool.txt > cool_clean.txt

Сценарий:

use warnings;
use strict;
use Text::CSV;
use autodie;

my $csv_in = Text::CSV->new();
my $csv_out = Text::CSV->new( { sep_char => "\t", eol => "\n" } );
open my $fh, '<', 'data.csv';
open my $out, '>', 'mool.txt';
while (my $row = $csv_in->getline($fh)) {
    $csv_out->print($out, $row);
}
2 голосов
/ 21 июля 2011

Поместите это утверждение в цикл while. chomp Это должна быть первая строка после чтения строки из файла. Это удалит ненужные пробелы.

use strict;
use warnings;
open(FILE4,"cool.txt");
open(FILE6,">./mool.txt");

while (<FILE4>)
{
     chomp; #This will remove unwanted spaces
     @array = split(/,/,$_); #$_ will represent the line which is read
     print FILE6 ($array[0]);
     print FILE6 ("\t");
     print FILE6 ($array[1]);
     print FILE6 ("\t");
     print FILE6 ($array[2]);
     print FILE6 ("\n");
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...