Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Text::CSV


Автор: Sadok 6.7.2005, 12:52
Сабжевый модуль (впрочем как и Text::CSV::Simple и Text::CSV_XS) не хочет обрабатывать csv-файлы, если в них содержаться русские буквы. Просто валится с Failed on <тут строка разбора>. С англиским языком проблем не возникает. use locale крутил - не помогает.

This is perl, v5.8.3 built for MSWin32-x86-multi-thread


Куда бы покрутить или посоветуйте рабочий модуль. Спасибо.

Автор: sharq 8.7.2005, 10:26
Sadok просто напросто - это ограничение модуля, кириллица - недопустимые символы.

Вот те кусок модуля:
Код

$column =~ /[^\t\040-\176]


Если тебе так необходимо использовать этот модуль, то пиши на латинице!

Автор: Sadok 9.7.2005, 20:03
sharq
Это да. Даже менял на $column =~ /[^\t\040-\337], но не помогло. Пришлось брать регексп из Mastering Regular Expressions

Автор: sharq 13.7.2005, 00:58
Цитата(Sadok @ 9.7.2005, 20:03)
Пришлось брать регексп из Mastering Regular Expressions

интересно, что именно и как получилось?

Автор: Sadok 13.7.2005, 08:59
sharq
Цитата
интересно, что именно и как получилось?

Собственно, сам регексп вот:
Код
sub parse_csv1 {
    my $text = shift;      # record containing comma-separated values
    my @fields  = ( );
    
    while ($text =~ m{
        # Either some non-quote/non-comma text:
        ( [^"',] + )
        
        # ...or...
        | 
        
        # ...a double-quoted field: (with "" allowed inside)
        
        " # field's opening quote; don't save this
        (   now a field is either
        (?:     [^"]    # non-quotes or
        |
        ""      # adjacent quote pairs
        ) *  # any number
        )
        " # field's closing quote; unsaved
        
        }gx)
            {
                if (defined $1) {
                    $field = $1;
                    } else {
                        ($field = $2) =~ s/""/"/g;
                    }
                push @fields, $field;
            }
        return @fields;
    }


Минус один он пустые поля пропускает, т.е. пропарсив
Код
qq /"Раз", "", "Три"/;

мы получим
Код
$fields[0] = "Раз";
$fields[1] = "Три";

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)