【问题标题】:Converting .csv format (Import-Csv ) to string in PowerShell在 PowerShell 中将 .csv 格式(Import-Csv)转换为字符串
【发布时间】:2023-03-14 22:25:01
【问题描述】:

我正在尝试编写一个 PowerShell 脚本来

  1. 读入 CSV 文件
  2. 循环遍历 CSV 文件中的每一行。
  3. 在每个循环中,我想将 CSV 标头和行值传递给另一个脚本,均采用 System.String 类型格式。

特别是,我正在努力转换为字符串类型格式——最好的方法是什么。

脚本 1:

$csvPath = 'C:\Temp\Scripts\trial_csv.csv'

# Get the header
$header = Get-Content $csvPath -TotalCount 1
$IntermediateOutput = "'C:\Temp\Scripts\output'"
$scriptPath = 'C:\Temp\Scripts\Temp.ps1'

# Get the data
Get-Content $csvPath |
Select -Skip 1 |
ForEach-Object {
    $argumentList = @()
    $argumentList += ("-Header", $header)
    $argumentList += ("-row", $row)
    $argumentList += ("-IntermediateOutput", $IntermediateOutput)
    $argumentList += ("-index", $i )

    Invoke-Expression "& `"$scriptPath`" $argumentList"
}

脚本 2:

从脚本 1 接收输入:

Param(
    [Parameter(Mandatory=$True)]
    [String]$header, # The header of CSV file
    [Parameter(Mandatory=$True)]
    [String]$row,  # The row of the file, like "1,0,2,.."
    [Parameter(Mandatory=$True)]
    [String]$IntermediateOutput,  # Intermediate directory
    [Parameter(Mandatory=$True)]
        [String]$index        # Index
    )

Do something later (todo)
$a = $header
$b = $row
$c = $IntermediateOutput
$d = $index

【问题讨论】:

  • 最好提出具体的问题:展示你的代码,解释它的作用以及你无法弄清楚的地方。在它的当前形式中它是模糊的:object.ToString 转换为 System.String,但你可能已经知道了。
  • 我收到一个错误,不知道为什么:缺少参数“header”的参数。指定“System.String”类型的参数,然后重试。

标签: string powershell csv


【解决方案1】:

如果您的 CSV 文件中的数据没有被引用,您应该可以直接从 .csv 文件中使用它,而无需执行 Import-Csv:

$csvPath = 'C:\Temp\Scripts\trial_csv.csv'
$IntermediateOutput = "'C:\Temp\Scripts\output'"
$Index = 1

# Get the header
$header = Get-Content $csvPath -TotalCount 1

# Get the data
Get-Content $csvPath |
Select -Skip 1 |
    ForEach-Object {
        $argumentlist = "-Header '{0}' -row '{1}' -IntermediateOutput {2} -Index {3}" -f $header,$_,$IntermediateOutput,$Index

        # Execute script with argument list

        $Index++
    }

【讨论】:

    【解决方案2】:

    您可以直接从新创建的$csv 对象中获取标头。在下面的例子中,$header 变成了一个字符串数组:

    $header = ($csv[0].psobject.Properties | 
        where {$_.MemberType -eq "NoteProperty"  }).Name
    

    另一种方法是使用Get-Content cmdlet 读取第一行并将其拆分为, 字符:

    $header = (Get-Content $csvPath -TotalCount 1) -split ","
    

    在您的代码中,$header 等于 null,因为 $header = Write-Host $rows[1] 没有分配变量。它只执行一个动作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 2017-10-19
      相关资源
      最近更新 更多