【问题标题】:Rebuilding CSV and using a field value for the exported file name重建 CSV 并为导出的文件名使用字段值
【发布时间】:2016-06-25 10:05:56
【问题描述】:

我想从一行中读取一个字符串,然后将其放入一个变量中,该变量之后用作文件名。 该字符串位于第二行末尾的 .csv 文件中。由于不必要的标题,需要删除第一行。 还有';'旧的 .csv 文件中使用的需要替换为真正的逗号 ','。 到目前为止,我已经获得了以下 PowerShell 脚本:

Powershell -command "(gc file1.csv | select -skip 1) -replace ';', ',' | Foreach-Object{ $_ + ',' } | Out-File file2.csv"

代码说明:

gc file1.csv | select -skip 1 获取 csv 文件的内容。并从临时数组中删除第一行。

-replace ';', ',' 替换所有 ';'用','。

Foreach-Object{ $_ + ',' } 在所有行的末尾添加逗号(这是必要的)。

Out-File file2.csv 创建一个名为“file2.csv”的输出文件。

输入文件的格式如下:(.csv 的前 2 行)

123.256.862;;0;568.153.135;12;0;;255.253.233

123.633.582;;0;568.588.533;12;0;;255.253.233

脚本生成的输出文件如下:(.csv 的前 2 行)

123.256.862,,0,568.153.135,12,0,,255.253.233,

123.633.582,,0,568.588.533,12,0,,255.253.233,

在 PowerShell 中编程时会出现以下问题:

  1. 如何将此代码编程为多行以提高可读性?

  2. 如何从第二行读取最后一个元素并将其放入变量中?

  3. $Out-File $variable & '.csv' 使用此变量作为名称生成新文件是否正确?我已经用虚拟变量尝试过这种方法,但它似乎没有用。更具体地说:新文件名需要为 255.253.233.csv。

我已经在 Google 上搜索了很多关于如何在 PowerShell 中初始化任何变量的信息,但仍然不清楚之后如何准确地声明它。我希望我在寻求解决方案的正确道路上。非常感谢任何帮助。

【问题讨论】:

  • 真的在使用 PowerShell 1.0 吗?我们现在是 v5.0,1.0 甚至没有在任何当前支持的 Windows 版本上发布。运行$psversiontable.PSVersion 以获取您正在运行的真实版本。
  • 2.0 版,是正确的。我只检查了 C:\Windows\System32\WindowsPowerShell 的安装文件夹,并且只有一个名为 1.0 的文件夹。奇怪的微软没有更新文件夹名..
  • 真的吗?你还停留在2.0?你在运行什么操作系统?它必须是旧的 Windows 7 安装。我建议升级到至少 PowerShell v3。忽略你在可执行文件路径中看到的内容,通过$PSVersionTable
  • 我执行了你告诉的命令,它声明 v2.0。我还需要在其他一些 PC 上运行该脚本,我不能保证它们运行的​​是比 v2.0 更新的版本。为 3.0 生成的脚本是否也向后兼容 2.0
  • 不,并非所有 v3 脚本都适用于 v2,因为随着时间的推移会添加新的 cmdlet。您确实应该将您的环境升级到每个系统支持的最新版本 - 使其成为您的软件修补策略/流程的一部分。

标签: csv powershell powershell-2.0


【解决方案1】:

您可以将 import-csv 与自定义标头 (-headers) 一起使用,对于具有不同分隔符的 im/exporting 使用 -delimiter 参数。 保存时使用export-csv -path $filename(如果$filename 已经带有.csv)或export-csv -path $(".\$filename.csv")

编辑:也许发布输入文件的前 2(+) 行以获得改进的答案。

【讨论】:

  • 如果需要与其他程序的互操作性,将-NoTypeInformation 包含在Export-Csv 中通常也是一个好主意。
【解决方案2】:

不清楚您对新输出文件中的标头做了什么,但我想向您展示如何将文件转换为 CSV 对象以简化处理。如果您计划在导出之前在 PowerShell 中对这些数据执行任何其他操作,这将特别有用。

$path = "c:\temp\file1.csv"
# Drop the header which is apparently useless.
$content = Get-Content $path | Select-Object -Skip 1
# Figure out how many fields we have
$maxHeaderIndex = @([char[]]$content[0] -match ";").Length
# Convert the file into a csv object
$csvData = $content | ConvertFrom-Csv -Delimiter ";" -Header (0..($maxHeaderIndex + 1))
# Write this to file now.
$csvData | Export-Csv -NoTypeInformation -Path "$($csvData[0].$maxHeaderIndex).csv"

我使用了多行,因为您似乎更喜欢那些可读性。这可以很容易地用更少的行来完成,但如果它有效,那就没关系了。

我们从文件中删除第一行,然后将其转换为 CSV。需要为此创建一个任意标题,因此我们使用数字。为了得到尾随逗号,我们将列数加一。 PowerShell 现在将为每一行创建一个空字段。导出时,您现在将有一个尾随逗号。

如果您不希望输出中的标题也不难。将上面的最后一行更改为以下内容,您将获得没有标题的 CSV 数据。

$csvData | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content "$($csvData[0].$maxHeaderIndex).csv"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2018-07-20
    相关资源
    最近更新 更多