Как удалить символы новой строки, пока в каждой строке не будет определенное количество экземпляров определенного символа? - PullRequest
1 голос
/ 21 января 2011

У меня настоящий беспорядок в файле с разделителями каналов, который мне нужно загрузить в базу данных.Файл имеет 35 полей и, следовательно, 34 канала.Одно из полей состоит из HTML-кода, который для некоторых записей включает несколько разрывов строк.К сожалению, нет ничего хорошего в том, куда попадают разрывы строк.

Решение, которое я придумала, состоит в том, чтобы подсчитывать количество каналов в каждой строке и, пока это число не достигнет 34, удалить из этой строки символ новой строкилиния.Я не очень хорошо разбираюсь в Perl, но думаю, что близок к достижению того, что я хочу сделать.Есть предложения?

#!/usr/local/bin/perl

use strict;

open (FILE, 'test.txt');

while (<FILE>) {
    chomp;
    my $line = $_;
    #remove null characters that are included in file
    $line =~ tr/\x00//;
    #count number of pipes
    my $count = ($line =~ tr/|//);
    #each line should have 34 pipes
    while ($count < 34) {
        #remove new lines until line has 34 pipes
        $line =~ tr/\r\n//;
        $count = ($line =~ tr/|//);
        print "$line\n";
    }
}

Ответы [ 2 ]

1 голос
/ 21 января 2011

Это должно работать, я думаю.

#!/usr/bin/perl

use strict;

open (FILE, 'test.txt');

my $num_pipes = 0, my $line_num = 0;
my $tmp = "";
while (<FILE>)
{
    $line_num++;
    chomp;
    my $line = $_;
    $line =~ tr/\x00//; #remove null characters that are included in file
    $num_pipes += ($line =~ tr/|//); #count number of pipes
    if ($num_pipes == 34 && length($tmp))
    {
            $tmp .= $line;
            print "$tmp\n";
            # Reset values.
            $tmp = "";
            $num_pipes = 0;
    }
    elsif ($num_pipes == 34 && length($tmp) == 0)
    {
            print "$line\n";
            $num_pipes = 0;
    }
    elsif ($num_pipes < 34)
    {
            $tmp .= $line;
    }
    elsif ($num_pipes > 34)
    {
            print STDERR "Error before line $line_num. Too many pipes ($num_pipes)\n";
            $num_pipes = 0;
            $tmp = "";
    }
}
1 голос
/ 21 января 2011

Twiddle с $/, входной разделитель записей ?

while (!eof(FILE)) {

    # assemble a row of data: 35 pipe separated fields, possibly over many lines
    my @fields = ();
    {
        # read 34 fields from FILE:
        local $/ = '|';
        for (1..34) {
            push @fields, scalar <FILE>;
        }
    }   # $/ is set back to original value ("\n") at the end of this block

    push @fields, scalar <FILE>;  # read last field, which ends with newline
    my $line = join '|', @fields;
    ... now you can process $line, and you already have the @fields ......
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...