У меня есть одна строка данных о температуре в текстовом файле, которую я хотел бы преобразовать в один столбец и сохранить в виде файла CSV с помощью сценария PowerShell. Температуры разделяются запятыми и выглядят следующим образом:
21,22,22,22,22,22,22,20,19,18,17,16,15,14,13,12,11,10,9,9,9,8,8,9,8,8,8,9,9,8,8,8,9,9,9,8,8,8,8,8,9,10,12,14,15,17,19,20,21,21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,22,24,25,26,27,27,27,28,28,28,29,29,29,28,28,28,28,28,28,27,27,27,27,27,29,30,32,32,32,32,33,34,35,35,34,33,32,32,31,31,30,30,29,29,28,28,27,28,29,31,33,34,35,35,35,36,36,36,36,36,36,36,36,36,37,37,37,37,37,37,38,39,40,42,43,43,43,43,43,42,42,42,41,41,41,41,40,39,37,36,35,34,33,32,31,31,31,31,31,31,31,31,31,31,
Я пробовал несколько методов, основанных на поиске на этом форуме. Я думал, что это может сработать, но возвращает ошибку: Транспонировать строки в столбцы в PowerShell
Это модифицированный код, который я пробовал, который возвращает: Ошибка: «Входная строка имеет неправильный формат».
$txt = Get-Content 'C:myfile.txt' | Out-String
$txt -split '(?m)^,\r?\n' | ForEach-Object {
# create empty array
$row = @()
$arr = $_ -split '\r?\n'
$k = 0
for ($n = 0; $n -lt $arr.Count; $n += 2) {
$i = [int]$arr[$n]
# if index from record ($i) is greater than current index ($k) append
# required number of empty fields
for ($j = $k; $j -lt $i-1; $j++) { $row += $null }
$row += $arr[$n+1]
$k = $i
}
$row -join '|'
}
Кажется, что это должно быть просто сделать только с одной строкой данных. Есть ли какие-либо предложения о том, как преобразовать эту единственную строку чисел в один столбец?
Предполагая, что я правильно понимаю ваше намерение, основываясь на вашем словесном описании (а не на вашей собственной попытке кодирования):
# Create simplified sample input file
@'
21,22,23,
'@ > myfile.txt
# Read the line, split it into tokens by ",", filter out empty elements
# with `-ne ''` (to ignore empty elements, such as would
# result from the trailing "," in your sample input),
# and write to an output CSV file with a column name prepended.
(Get-Content myfile.txt) -split ',' -ne '' |
ForEach-Object -Begin { 'Temperatures' } -Process { $_ } |
Set-Content out.csv
Более сжатая альтернатива, использующая расширяемую (интерполирующую) здесь-строку:
# Note: .TrimEnd(',') removes any trailing "," from the input.
# Your sample input suggests that this is necessary.
# If there are no trailing "," chars., you can omit this call.
@"
Temperatures
$((Get-Content myfile.txt).TrimEnd(',') -split ',' -join [Environment]::NewLine)
"@ > out.csv
Out.csv затем содержит:
Temperatures
21
22
23
Я думаю, что ваше решение более элегантно, чем мое. Я стремился к тому, чтобы новичок в powershell мог легко прочитать и понять.
Спасибо, @WalterMitty. Учитывая, что ОП принял ваш ответ, вы достигли своей цели, не в последнюю очередь потому, что вы также предоставили подробное объяснение.
Попробуй это:
# convert row to column data
$header = 'TEMPERATURE'
$values = $(Get-Content input.dat) -split ','
$header, $values | Out-File result.csv
#now test the result
Import-Csv result.csv
Заголовок — это первая строка (или запись) в файле CSV. В данном случае это одно слово, потому что есть только один столбец.
Значения — это элементы между запятыми во входных данных. В этом случае -split на запятых создает массив строк. Обратите внимание, что если запятая является разделителем, после последней температуры запятая не ставится. Ваши данные не выглядят так, но я предположил, что это реальные данные.
Затем мы просто записываем заголовок и массив в файл. Но что случилось со всеми запятыми? Оказывается, для CSV-файла с одним столбцом поля запятыми не разделяются. Таким образом, в результате получается простой CSV-файл.
Наконец, есть тест вывода с использованием Import-csv для чтения результата и отображения его в формате таблицы.
Это не обязательно лучший способ написания кода, но он может помочь новичку привыкнуть к powershell.
Каким должно быть имя столбца? Если я правильно понимаю, это должно быть так же просто, как разделить запятую, а затем добавить заголовок