Могу ли я преобразовать строку значений, разделенных запятыми, в столбец

У меня есть одна строка данных о температуре в текстовом файле, которую я хотел бы преобразовать в один столбец и сохранить в виде файла 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 '|'
}

Кажется, что это должно быть просто сделать только с одной строкой данных. Есть ли какие-либо предложения о том, как преобразовать эту единственную строку чисел в один столбец?

Каким должно быть имя столбца? Если я правильно понимаю, это должно быть так же просто, как разделить запятую, а затем добавить заголовок

Santiago Squarzon 20.11.2022 01:18
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
1
1
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предполагая, что я правильно понимаю ваше намерение, основываясь на вашем словесном описании (а не на вашей собственной попытке кодирования):

# 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 мог легко прочитать и понять.

Walter Mitty 22.11.2022 13:53

Спасибо, @WalterMitty. Учитывая, что ОП принял ваш ответ, вы достигли своей цели, не в последнюю очередь потому, что вы также предоставили подробное объяснение.

mklement0 23.11.2022 04:12
Ответ принят как подходящий

Попробуй это:

# 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.

Другие вопросы по теме