Открытие файла CSV, созданного в Mac Excel с помощью Perl - PullRequest
2 голосов
/ 14 февраля 2011

У меня небольшие проблемы с кодом Perl ниже. Я могу открыть и прочитать в файле CSV, который я создал вручную, но если я пытаюсь открыть любую электронную таблицу Mac Excel, которую я сохраняю как файл CSV, код ниже читает все это как одну строку.

#!/usr/bin/perl

use strict;
use warnings;

open F, "file.csv";

foreach (<F>)
{
    ($first, $second, undef, undef) = split (',', $_);
}

print "$first : $second\n";

close(F);

Ответы [ 6 ]

10 голосов
/ 14 февраля 2011

Всегда используйте для этой цели специализированный модуль (например, Text::CSV или Text::CSV_XS), поскольку существует множество случаев, когда split -ing не поможет ( например, когда поля содержат запятую, которая не является разделителем полей, но находится в кавычках).

5 голосов
/ 14 февраля 2011

Традиционный Macintosh (система 9 и более ранние) использует CR (0x0D, \ r) в качестве разделителя строк.Mac OS X (на основе Unix) использует LF (0x0A, \ n) в качестве разделителя строк по умолчанию, поэтому сценарий perl, будучи инструментом Unix, вероятно, ожидает LF, но получает CR.Поскольку в файле нет разделителей строк, Perl считает, что есть только одна строка.Если бы он имел окончания строки Windows (CR, LF), вы, вероятно, получили бы невидимый CR в конце каждой строки.

Быстрый цикл по входу, заменяющий 0x0D на 0x0A, должен решить вашу проблему.*

3 голосов
/ 15 февраля 2011

Я непосредственно столкнулся с этой проблемой в Excel 2004 для Mac.Окончания строк действительно \r, и IIRC, текст использует набор символов MacRoman, а не Latin-1 или UTF-8, как вы могли бы ожидать.

Так же как и хороший совет по использованию текста:: CSV / Text :: CSV_XS и разделив на \r, вы захотите открыть файл, используя кодировку MacRoman, например:

open my $fh, "<:encoding(MacRoman)", $filename
   or die "Can't read $filename: $!";

Аналогично, при чтении файла, экспортированного в Excel в Windows,Вы можете использовать :encoding(cp1252) вместо :encoding(MacRoman) в этом коде.

2 голосов
/ 15 февраля 2011

Как и другие подозревали, возможно, виноваты твои окончания строки. В моей системе на основе Linux есть встроенные утилиты для изменения этих концов строк. mac2unix (я думаю, что это просто оболочка для dos2unix, которая прочитает ваш файл и изменит окончания строк для вас. У вас должно быть что-то похожее как в Linux, так и в Mac (Microsoft может вас не волновать).

Если вы хотите обработать это в Perl, посмотрите на установку переменной $/, чтобы установить «разделитель входных записей» из «\ n» в «\ r» (если это правильный конец). Попробуйте local $/ = "\r", прежде чем читать файл. Узнайте больше об этом в perldoc perlvar (около $/) или в perldoc perlport (посвященном написанию переносимого кода Perl.

P.S. если у меня есть какая-то часть этого неверного, дайте мне знать, я не использую Mac, я просто думаю, что знаю теорию

2 голосов
/ 14 февраля 2011

Не уверен насчет Mac Excel, но, конечно, версия для Windows имеет тенденцию заключать все значения в кавычки: "like","this".Кроме того, вам необходимо принять во внимание возможность наличия в значении кавычки, которая будет отображаться как "like""this" (в этом значении только один ").

Чтобы действительно ответить на ваш вопросоднако вполне вероятно, что он использует символ новой строки, отличный от того, который вы ожидаете.Вероятно, он сохраняется как \r\n вместо \n или наоборот.

0 голосов
/ 02 августа 2012

если вы установите "специальную переменную", которая обрабатывает то, что она считает новой строкой, для \ r, вы сможете читать по одной строке за раз: $ / = "\ r";в этом конкретном случае новая строка mac для perl - это значение по умолчанию \ n, но файл, вероятно, использует \ r.Это основано на том, что сказали Flynn1179 и Марк Талман, но показывает вам, что нужно сделать, чтобы использовать чтение в стиле while ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...