2016-06-23 3 views
0

Каждый день я получаю много файлов CSV, которые мне нужно импортировать в систему. Но прежде чем я могу их импортировать, мне нужно кодировать ВСЕ их в UTF-8, а затем загружать их по одному. Вот почему мне нужен скрипт, который кодирует все * .csv-файлы в UTF-8, а затем объединяет их в один файл.Проблема с файлом с табуляцией Out-File

Сценарий работает нормально, но когда я экспортирую файл, первая вкладка была удалена, что является большой проблемой.

Как выглядит один файл, прежде чем он кодируется и сливался:

USERID ACTIVE FIRSTNAME LASTNAME EMAIL LANGUAGE HOSTPRIVILEGE TIMEZONE DIVISION DEPARTMENT PROJECT OTHER CUSTOM5 CUSTOM6 CUSTOM7 CUSTOM8 CUSTOM9 CUSTOM10 COUNTRY 
    Y <firstname> <lastname> <[email protected]> de <text> <text>       <randomnumber>    

(Похоже, Stackoverflow не нравится вкладки или им просто в noobish ..: S)

На самом деле вторая строка начинается с одной вкладки, затем каждый «блок» разделяется одной вкладкой. За исключением последнего, это 7 вкладок между «текстом» и «случайным числом».

Когда я запускаю сценарий выглядит следующим образом:

USERID ACTIVE FIRSTNAME LASTNAME EMAIL LANGUAGE HOSTPRIVILEGE TIMEZONE DIVISION DEPARTMENT PROJECT OTHER CUSTOM5 CUSTOM6 CUSTOM7 CUSTOM8 CUSTOM9 CUSTOM10 COUNTRY 
Y <firstname> <lastname> [email protected] de <text> <text>       <randomnumber>    
Y <firstname> <lastname> [email protected] de <text> <text>       <randomnumber> 

Первая закладка теряется.

А вот сценарий PowerShell:

Copy-Item ".\1_Input\*.csv" ".\2_cache" 
Get-ChildItem ".\2_Cache\*.csv" | foreach { 
    (Get-Content $_.FullName) | Set-Content $_.FullName -Encoding UTF8 
} 
ls ".\2_cache" -Fi *.csv | ipcsv | 
    ConvertTo-Csv -NoTypeInformation | 
    % { $_ -replace '"', ''} | 
    Out-File ".\3_output\concat.csv" -fo -en utf8 
Remove-Item ".\2_cache\*.csv" 

EDIT: Я нашел "обходной путь", я добавил параметр

ipcsv -delimiter "`t" 

, но я получаю ошибки, когда я добавить параметр ConvertTo -CSV. Итак, теперь он экспортируется с разделителем ",". Но система, к счастью, умеет читать импорт, также разделенный запятой.

ответ

1

Если вы хотите преобразовать файлы в UTF-8, а затем объединить их, было бы намного проще получить строку заголовка из одного файла, а затем пропустить заголовок для всех файлов по мере их записи в выходной файл :

$files = @(Get-ChildItem '.\1_Input\*.csv') 
$outfile = 'concat.csv' 

Get-Content $files[0] -TotalCount 1 | Set-Content $outfile -Encoding UTF8 
$files | ForEach-Object { 
    Get-Content $_.FullName | Select-Object -Skip 1 
} | Add-Content $outfile -Encoding UTF8 
+0

Спасибо, что работает отлично! Я «конвертировал» финальные скрипты в .exe, поэтому даже «манекены» должны иметь возможность использовать его. Но тогда Kaspersky Antivirus идентифицирует его как трояна, lol. Черт возьми. Возможно, я останусь с сценарием .ps1. EDIT: я использовал PS2EXE для «преобразования» сценария, если кто-то хочет знать .. – Shunator

+0

Попробуйте вместо этого использовать PowerGUI (бесплатно), возможно, вы лучше обойдете Kaspersky. Должна быть какая-то белая система. – sodawillow

Смежные вопросы