如何通过PowerShell将单行逗号分隔温度数据转为单列并保存为CSV?
问题描述
我有一个文本文件,其中包含一行以逗号分隔的温度数据,希望通过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,
我尝试了修改后的代码,但出现报错:Input string was not in a correct format。修改后的代码如下:
$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 '|' }
仅处理单行数据的场景应该不难,请问有什么方法可以将这行数据转换为单列?
解决方法
你的问题核心是把单行逗号分隔的数据拆成单列,不需要复杂的转置逻辑,以下是几种简单可行的方案:
方法一:生成带表头的标准CSV
这是最规范的方式,直接读取数据并生成符合CSV格式的文件:
# 读取文件内容,按逗号拆分后过滤空项 $temperatures = (Get-Content 'C:\myfile.txt' -Raw) -split ',' | Where-Object { $_ -match '\d+' } # 将每个温度值包装为对象,指定列名后导出为CSV $temperatures | ForEach-Object { [PSCustomObject]@{ Temperature = $_ } } | Export-Csv -Path 'C:\output.csv' -NoTypeInformation
Get-Content -Raw一次性读取整个文件为单个字符串,避免换行干扰-split ','按逗号拆分数据,Where-Object过滤掉末尾逗号产生的空值- 用
PSCustomObject包装数据,确保CSV包含明确的列名,Export-Csv生成标准CSV文件
方法二:快速生成无表头的单列文件
如果不需要CSV表头,或者只想生成纯文本单列文件,可以用更简洁的命令:
# 生成纯文本单列文件 (Get-Content 'C:\myfile.txt' -Raw) -split ',' | Where-Object { $_ -match '\d+' } | Out-File 'C:\output.txt' # 生成无表头的CSV文件 (Get-Content 'C:\myfile.txt' -Raw) -split ',' | Where-Object { $_ -match '\d+' } | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Out-File 'C:\output.csv'
原代码报错原因
你之前的代码是针对带索引的行转列数据编写的,完全不适用于当前场景:
- 代码尝试将
$arr[$n]转为整数,但你的数据全是温度值,没有索引字段,强制转int自然会报错 - 原逻辑是处理成对的索引-值数据,和当前简单的逗号拆分需求不匹配
内容的提问来源于stack exchange,提问作者weatherdoc
相关产品推荐
相关产品推荐

