PowerShell 技能连载 - CSV 数据处理技巧

在 PowerShell 中处理 CSV 数据是一项常见任务,特别是在处理报表、数据导入导出时。本文将介绍一些实用的 CSV 处理技巧。

首先,让我们看看如何创建和读取 CSV 数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建示例 CSV 数据
$csvData = @"
姓名,年龄,部门,职位,入职日期
张三,30,技术部,高级工程师,2020-01-15
李四,28,市场部,市场经理,2019-06-20
王五,35,财务部,财务主管,2018-03-10
赵六,32,人力资源部,HR专员,2021-09-05
"@

# 将 CSV 字符串保存到文件
$csvData | Out-File -FilePath "employees.csv" -Encoding UTF8

# 读取 CSV 文件
$employees = Import-Csv -Path "employees.csv" -Encoding UTF8

# 显示数据
Write-Host "员工列表:"
$employees | Format-Table

处理带有特殊字符的 CSV:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建包含特殊字符的 CSV
$specialCsv = @"
产品名称,价格,描述,备注
"笔记本电脑",5999,"高性能,轻薄便携","支持""快速充电"""
"无线鼠标",199,"人体工学,静音","包含""电池"""
"机械键盘",899,"RGB背光,青轴","支持""宏编程"""
"@

# 使用引号处理特殊字符
$specialCsv | Out-File -FilePath "products.csv" -Encoding UTF8

# 读取并处理特殊字符
$products = Import-Csv -Path "products.csv" -Encoding UTF8
Write-Host "`n产品列表:"
$products | Format-Table

使用自定义分隔符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建使用分号分隔的 CSV
$semicolonCsv = @"
姓名;年龄;部门;职位
张三;30;技术部;高级工程师
李四;28;市场部;市场经理
王五;35;财务部;财务主管
"@

$semicolonCsv | Out-File -FilePath "employees_semicolon.csv" -Encoding UTF8

# 使用自定义分隔符读取
$employees = Import-Csv -Path "employees_semicolon.csv" -Delimiter ";" -Encoding UTF8
Write-Host "`n使用分号分隔的员工列表:"
$employees | Format-Table

数据过滤和转换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 读取 CSV 并进行数据过滤
$employees = Import-Csv -Path "employees.csv" -Encoding UTF8

# 过滤特定部门的员工
$techDept = $employees | Where-Object { $_.部门 -eq "技术部" }
Write-Host "`n技术部员工:"
$techDept | Format-Table

# 转换数据格式
$employees | ForEach-Object {
[PSCustomObject]@{
姓名 = $_.姓名
年龄 = [int]$_.年龄
部门 = $_.部门
职位 = $_.职位
入职日期 = [datetime]$_.入职日期
工作年限 = ((Get-Date) - [datetime]$_.入职日期).Days / 365
}
} | Export-Csv -Path "employees_processed.csv" -NoTypeInformation -Encoding UTF8

一些实用的 CSV 处理技巧:

  1. 处理大文件:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 使用流式处理大型 CSV 文件
    $reader = [System.IO.StreamReader]::new("large-data.csv")
    $header = $reader.ReadLine().Split(",")
    while (-not $reader.EndOfStream) {
    $line = $reader.ReadLine().Split(",")
    $record = @{}
    for ($i = 0; $i -lt $header.Count; $i++) {
    $record[$header[$i]] = $line[$i]
    }
    [PSCustomObject]$record
    }
    $reader.Close()
  2. 数据验证:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function Test-CsvFormat {
    param(
    [string]$CsvPath,
    [string[]]$RequiredColumns
    )

    $csv = Import-Csv -Path $CsvPath -Encoding UTF8
    $headers = $csv[0].PSObject.Properties.Name

    foreach ($column in $RequiredColumns) {
    if ($column -notin $headers) {
    return $false
    }
    }
    return $true
    }
  3. 合并多个 CSV 文件:

1
2
3
4
5
6
7
# 合并多个 CSV 文件
$csvFiles = Get-ChildItem -Path "*.csv" -Filter "employees_*.csv"
$allEmployees = @()
foreach ($file in $csvFiles) {
$allEmployees += Import-Csv -Path $file.FullName -Encoding UTF8
}
$allEmployees | Export-Csv -Path "all_employees.csv" -NoTypeInformation -Encoding UTF8

这些技巧将帮助您更有效地处理 CSV 数据。记住,在处理大型 CSV 文件时,考虑使用流式处理方法来优化内存使用。同时,始终注意数据的完整性和格式的正确性。

PowerShell 技能连载 - CSV 数据处理技巧

http://blog.vichamp.com/2024/08/22/powershell-csv-handling/

作者

吴波

发布于

2024-08-22

更新于

2025-03-25

许可协议

评论