2012-01-21 3 views
4

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

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

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

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

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

+0

Вы используете модуль (например, Text :: CSV) или сами разбираете файл CSV? Я настоятельно рекомендую использовать хорошо протестированный модуль. – dgw

+1

Какая именно команда вы используете в Powershell? Не просто скажите, что вы делаете, покажите это. – manojlds

+0

Я использую сценарий импорта, который поставляется с программным обеспечением nConf. Я считаю, что он основан на Text :: CSV. Я не прямо перед моим кодом прямо сейчас Мано, но я отправлю точную команду, как только буду. Спасибо! – Sune

ответ

6

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

Update - Вот как преобразовать текстовый файл из 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) 

Или вы можете использовать Notepad ++ (Edit> EOL Conversion> Unix Format).

+0

Это был замечательный совет! Я действительно открыл файлы в соответствии с вашим описанием и, конечно же, моя сломанная версия имела CR LF в конце каждой строки, а рабочая имела только LF. Я прочитал эту проблему, и, насколько я понимаю, это связано с файлами типа win/unix. Но как удалить CR? Или я должен экспортировать файл с другой кодировкой с помощью export-csv? (попробовал как Utf-8, так и стандарт ..) – Sune

+1

@Sune CR + LF - это способ Windows, в Unix требуется только LF, поэтому он выглядит так, как будто Perl-скрипт ожидает жить в мире Unix. Однако мы можем преобразовать файл. Ознакомьтесь с моим обновленным ответом. –

+0

В общем, нет необходимости преобразовывать файл. Просто измените способ чтения Perl. –

0

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

+0

Спасибо, Майкл, но я буду обрабатывать файл в Perl, и я просто использую Excel для просмотра содержимого для целей отладки. – Sune

1

От CPAN Text::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

Я не написал скрипт perl, который импортирует Csv, только сценарий экспорта (powershell). Сценарий импорта поставляется с программным пакетом nConf. Может быть, мне что-то не хватает, но я не уверен, что ваш ответ дал решение проблемы? – Sune

+1

@Sune Вы не упомянули об этом в своей первоначальной публикации. В моем сообщении предполагается, что вы можете редактировать скрипт perl. – dgw

2

Это может быть проблемой кодирования при использовании export-csv

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

+0

Я пробовал оба! – Sune

+0

Значит, вам это не удалось? Или вы? – Tom

+0

Нет, мне это не удалось. Решение заключалось в том, чтобы удалить CR из CSV. (См. Ответ выше) – Sune

0

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

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

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

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

$str | out-file -filepath "path\to\newcsv" -encoding UTF8 
Смежные вопросы