PowerShell读取逗号分隔TXT文件存入对应数组异常问题求助
问题原因
核心原因是没有提前初始化变量为数组类型,PowerShell默认会把首次赋值的变量识别为字符串类型,后续执行+=操作时会触发字符串拼接逻辑,而不是往数组追加元素,所以你访问$date[0]的时候实际是取拼接后长字符串的第一个字符,也就是2。
解决方法
方案1:保留原有多数组存储逻辑
首先在循环开始前提前初始化所有需要使用的空数组即可,修改后的完整代码如下:
# 提前初始化空数组 $date = @() $time = @() $speed = @() $distancefront = @() $distanceback = @() foreach($line in Get-Content .\auto.txt) { # 注意:如果$regex变量未定义,这里的匹配条件会直接跳过所有行,可根据需求调整判断逻辑 if($line -match $regex){ $splitline = $line.Split(",") $date += $splitline[0] $time += $splitline[1] $speed += $splitline[2] $distancefront += $splitline[3] $distanceback += $splitline[4] } }
修改后调用$date[0]就可以正常返回第一行的日期2003.09.23.。
方案2:更易维护的对象存储方案(推荐)
无需单独维护多个数组,直接把每行数据存为自定义对象,后续筛选、统计等操作更方便:
$autoRecords = Get-Content .\auto.txt | ForEach-Object { $splitline = $_.Split(",") [PSCustomObject]@{ Date = $splitline[0] Time = $splitline[1] Speed = [int]$splitline[2] DistanceFront = [int]$splitline[3] DistanceBack = [int]$splitline[4] } } # 使用示例:获取第一条记录的日期 $autoRecords[0].Date # 使用示例:筛选所有速度大于200的记录 $autoRecords | Where-Object Speed -gt 200
内容的提问来源于stack exchange,提问作者33lives
相关产品推荐
相关产品推荐

