Входной файл представляет собой файл txt с фиксированной шириной. Мой клиент обычно открывает его в Excel и вручную определяет разрывы столбцов. Я надеюсь заменить некоторые пробелы запятой, чтобы я мог анализировать CSV и сохранять как XLS или что-то еще.Преобразование файла txt с фиксированной шириной в CSV/set-content или out-file -append?
$columBreaks = 20, 35, 50, 80, 100, 111, 131, 158, 161, 167, 183
[array]::Reverse($columBreaks) #too lazy to re-write array after finding out I need to iterate in reverse
$files = get-childitem ./ |where-object {$_.Name -like "FileFormat*.txt"}
foreach($file in $files)
{
$name = $file.Name.split(".")
$csvFile = $name[0]+".csv"
if (!(get-childitem ./ |where-object {$_.Name -like $csvFile})) #check whether file has been processed
{
$text = (gc $file)
foreach ($line in $text)
{
foreach ($pos in $columBreaks)
{
#$line.Substring($char-1,3).replace(" ", ",")
$line = $line.Insert($pos,",")
#out-file -append?
}
}
}
#set-content?
}
Итак, что является самым эффективным способом написать этот контент? Я надеялся использовать set-content, но я не думаю, что это возможно, поскольку мы обрабатываем строки за строкой, поэтому я думаю, что мне придется либо построить массив строк для set-content, либо использовать функцию write-out - добавьте для каждой итерации. Есть ли более эффективный способ сделать это?
Спасибо за подсказку с базового имени. Установленное содержимое дает мне пустую ошибку. –
Сначала я пропустил ваше заявление if. Вы должны просто иметь возможность переместить бит заданного содержания в блок if (сразу после «foreach» ($ line in $ text) ' – morgb
Я не думаю, что трубка из foreach работает вообще. Я видел несколько примеры, которые используют объект foreach, но я изо всех сил пытался преобразовать внутренние петли в формат, необходимый для этого. –