powershell 是否可以将逗号分隔值的行转换为列

dbf7pr2w  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(192)

我在一个文本文件中有一行温度数据,我想将其转换为单列,并使用PowerShell脚本将其保存为CSV文件。温度由逗号分隔,如下所示:

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,

我已经尝试了几种基于搜索的方法在这个论坛我认为这可能会工作,但它返回一个错误:Transpose rows to columns in 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 '|'
}

这看起来应该很简单,只需要一行数据就可以了。有没有什么建议可以帮助你把这一行数字转换成一列呢?

ttygqcqt

ttygqcqt1#

试试这个:

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

mm9b1k5b

mm9b1k5b2#

假设我正确地理解了您的意图,基于您的口头描述(而不是您自己的编码尝试):

# 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

更简洁的替代方法,使用可扩展(插值)的here-string:

# 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

相关问题