Формат CSV не правильный? - PullRequest
       11

Формат CSV не правильный?

4 голосов
/ 22 января 2012

Я создаю CSV с EXPORT-CSV в Powershell, а затем передаю его в сценарий Perl. Но Perl не может импортировать файл.

Я проверил CSV-файл по рабочей версии (которая была экспортирована из того же Perl-скрипта, а не powershell), и никакой разницы нет. Колонки точно такие же, и у них обоих есть точка с запятой в качестве разделителя. Если я открою файл в Excel, то все закончится в первой ячейке каждой строки (то есть я должен сделать текст в столбцы). Рабочий файл с самого начала попадает в разные ячейки ..

Чтобы добавить к путанице: когда я открываю файл в блокноте и копирую / вставляю содержимое в новый файл, импорт работает!

Итак, что мне не хватает? Есть ли «скрытые» свойства, которые я не могу определить с помощью Блокнота? Нужно ли менять тип кодировки?

Пожалуйста, помогите:)

Ответы [ 5 ]

6 голосов
/ 22 января 2012

Чтобы лучше рассмотреть файлы CSV, попробуйте использовать Notepad ++ . Это сообщит вам кодировку файла в строке состояния. Также включите скрытые символы («Просмотр»> «Показать символ»> «Показать все символы»). Это покажет, есть ли только переводы строк или возврат каретки + переводы строк, табуляции или пробелов и т. Д. Вы также можете изменить кодировку файла из меню Кодировка. Это может помочь вам определить различия. Блокнот не отображает эту информацию.

Обновление - Вот как конвертировать текстовый файл из Windows в формат Unix в коде:

$allText = [IO.File]::ReadAllText("C:\test.csv") -replace "`r`n?", "`n" 
$encoding = New-Object System.Text.ASCIIEncoding    
[IO.File]::WriteAllText("C:\test2.csv", $allText, $encoding)

Или вы можете использовать Блокнот ++ (Правка> Преобразование EOL> Формат Unix).

2 голосов
/ 22 января 2012

При использовании export-csv

может возникнуть проблема с кодировкой. По умолчанию используется значение ASCII, которое обычно должно быть в порядке, но попробуйте установить -Encoding UTF8 в команде Export-CSV.

1 голос
/ 22 января 2012

С Текст CPAN :: CSV :

use Text::CSV;

my @rows;
my $csv = Text::CSV->new ( { binary => 1 } )  # should set binary attribute.
             or die "Cannot use CSV: ".Text::CSV->error_diag();

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";
while ( my $row = $csv->getline( $fh ) ) {
  $row->[2] =~ m/pattern/ or next; # 3rd field should match
  push @rows, $row;
}
$csv->eof or $csv->error_diag();
close $fh;

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

0 голосов
/ 22 января 2012

Учитывая то, что было обнаружено в других постах, я думаю, что вам лучше всего:

  1. Преобразовать в строку CSV (которая использует возврат каретки unix-y, а не Windows)
  2. Отправьте это в файл, убедившись, что кодировка не ASCII.

$str = $object | convertto-csv -notypeinformation | foreach-object { $_ -replace "`"","" } #

foreach-object - это хак для удаления лишних кавычек, добавленных convertto-csv.Если ваши данные могут иметь двойные кавычки, вам нужно посмотреть на альтернативы.

$str | out-file -filepath "path\to\newcsv" -encoding UTF8
0 голосов
/ 22 января 2012

Excel склонен считать, что файлы, сохраненные в формате .csv, действительно разделены запятыми. Тем не менее, кажется, что вы используете точки с запятой. Вы можете попробовать переключиться на запятую, или, если это не вариант, попробуйте изменить расширение на .txt. Excel должен автоматически распознать его, если вы выполните первое, а второе проведет вас через мастер импорта после загрузки файла.

...