使用 Powershell 删除包含特定字符的 .CSV 文件中的行
Delete rows in a .CSV file containing specific character with Powershell
我收到系统每周自动导出的 .csv 格式文件。它包含许多带有用户首字母的用户名(例如“fl”、“nk”)。他们中的一些人有他们的名字和姓氏,用逗号分隔(例如 firstname.lastname)。这些是必须从 .csv 文件中删除的内容。
我的目标是编写一个 Powershell 脚本,删除所有包含字符“.”的行。 (点),然后通过覆盖保存相同的 .csv 文件。
由于我是 Powershell 的新手,非常感谢您提供更详细的答案,包括潜在的代码。我尝试了来自类似问题的各种示例,我在此处找到了这些示例,但其中 none 有效 and/or 我收到错误消息,主要是因为我的语法不正确。
补充信息。这是 table.
的一部分
我试过这段代码:
Get-Content "D:\file.csv" | Where-Object {$_ -notmatch '\.'} | Set-Content "D:\File.csv"-Force -NoTypeInformation
正如 Mathias 所说,查看您尝试过的内容很有帮助,这样我们可以帮助您获得有效的结果。很容易给你这样的东西:
$csv = Import-Csv -Path C:\Temp\temp.csv -Delimiter ";"
$newCSV = @()
foreach($row in $csv){
if(!$row.username -or $row.username -notlike "*.*"){
$newCSV += $row
}
}
$newCSV | Export-Csv -Path C:\Temp\temp.csv -Delimiter ";" -NoTypeInformation
以上代码删除了用户名字段上带有点的行。它保留带有空用户名的行与 'if(!$row.username' 部分。但我不知道这是否有帮助,因为没有示例 CSV 文件,也没有办法知道您到目前为止尝试了什么 ;)
请注意,我总是喜欢使用“;”作为分隔符,因为在 Excel 中打开文件已经被正确分隔。如果当前文件使用“,”作为分隔符,您需要在导入 CSV 时更改它。
你们非常亲密!为此,您不需要循环,只需使用正确的 cmdlet 即可:
(Import-Csv -Path 'D:\file.csv' -Delimiter ';') |
Where-Object { $_.Initials -notmatch '\.' } |
Export-Csv -Path 'D:\file.csv' -Delimiter ';' -Force -NoTypeInformation
Get-Content
只是读取一个文本文件和 returns 行作为字符串数组,而 Import-Csv
解析结构并创建 objects 具有来自 [=21] 的属性=]行。
需要 Import-Csv
两边的括号以确保文件的 importing/parsing 在通过管道传递结果之前完全完成。否则,生成的文件可能会完全变空,因为您无法同时读取和覆盖同一个文件。
我收到系统每周自动导出的 .csv 格式文件。它包含许多带有用户首字母的用户名(例如“fl”、“nk”)。他们中的一些人有他们的名字和姓氏,用逗号分隔(例如 firstname.lastname)。这些是必须从 .csv 文件中删除的内容。
我的目标是编写一个 Powershell 脚本,删除所有包含字符“.”的行。 (点),然后通过覆盖保存相同的 .csv 文件。
由于我是 Powershell 的新手,非常感谢您提供更详细的答案,包括潜在的代码。我尝试了来自类似问题的各种示例,我在此处找到了这些示例,但其中 none 有效 and/or 我收到错误消息,主要是因为我的语法不正确。
补充信息。这是 table.
的一部分我试过这段代码:
Get-Content "D:\file.csv" | Where-Object {$_ -notmatch '\.'} | Set-Content "D:\File.csv"-Force -NoTypeInformation
正如 Mathias 所说,查看您尝试过的内容很有帮助,这样我们可以帮助您获得有效的结果。很容易给你这样的东西:
$csv = Import-Csv -Path C:\Temp\temp.csv -Delimiter ";"
$newCSV = @()
foreach($row in $csv){
if(!$row.username -or $row.username -notlike "*.*"){
$newCSV += $row
}
}
$newCSV | Export-Csv -Path C:\Temp\temp.csv -Delimiter ";" -NoTypeInformation
以上代码删除了用户名字段上带有点的行。它保留带有空用户名的行与 'if(!$row.username' 部分。但我不知道这是否有帮助,因为没有示例 CSV 文件,也没有办法知道您到目前为止尝试了什么 ;)
请注意,我总是喜欢使用“;”作为分隔符,因为在 Excel 中打开文件已经被正确分隔。如果当前文件使用“,”作为分隔符,您需要在导入 CSV 时更改它。
你们非常亲密!为此,您不需要循环,只需使用正确的 cmdlet 即可:
(Import-Csv -Path 'D:\file.csv' -Delimiter ';') |
Where-Object { $_.Initials -notmatch '\.' } |
Export-Csv -Path 'D:\file.csv' -Delimiter ';' -Force -NoTypeInformation
Get-Content
只是读取一个文本文件和 returns 行作为字符串数组,而 Import-Csv
解析结构并创建 objects 具有来自 [=21] 的属性=]行。
需要 Import-Csv
两边的括号以确保文件的 importing/parsing 在通过管道传递结果之前完全完成。否则,生成的文件可能会完全变空,因为您无法同时读取和覆盖同一个文件。