【问题标题】:Powershell replace reformats CSVPowershell 替换重新格式化 CSV
【发布时间】:2017-10-31 01:22:46
【问题描述】:

我有一个 csv,我想从中删除一些字符以进行进一步处理。在使用 regex -replace 方法之前,我已经这样做了很多次,但是这次它似乎把整个 csv 搞乱了。我正在使用:

$Removed_Characters=$Good_CSV|%{$_ -replace "X",""}

这不是没有“X”字符的相同csv,而是输出一系列数组,每行一个(即@{Name=Tom, ID=12}@{Name=Bill, ID=15}...)。这根本不是我想要的,也不是我过去看到的。我可以做些什么不同的事情?

【问题讨论】:

  • 我不清楚“重新格式化”是您问题的重要组成部分,还是一个错字。是否要删除或替换 CSV 中的文本?

标签: regex powershell csv


【解决方案1】:

看起来您正在尝试替换对象数组的任何属性中的字符串(来自 import-csv),但您可能只是打算替换单个值中的字符串。

您提供的脚本将每个对象转换为字符串,然后对该字符串值执行逐字符串替换。为您提供看起来像对象属性的散列。

替换 CSV 中特定字段的字符串

@"
Name,ID
Tom,12
Joe,15
"@ | out-file test.csv
$CSVFile = import-csv test.csv 
$CSVFile | %{$_.name = $_.name -replace 'o','i'}
$CSVFile
#Name ID
#---- --
#Tim  12
#Jie  15

替换 CSV 中任意字段的字符串

$Properties = $CSVFile | get-member -membertype noteproperty | select -expand name
$CSVFile | %{
    $entry=$_; 
    foreach ($prop in $Properties) {
        $entry.$prop = $entry.$prop -replace 'o|1','i'
    }
}
$CSVFile
#Name ID
#---- --
#Tim  i2
#Jie  i5

请注意,替换所有属性的值也会将所有这些值转换为字符串,因此您可能会失去保真度(日期等)。

祝你好运!

肖恩

【讨论】:

  • 谢谢,这行得通!我浏览了一些旧脚本,发现了我曾经做过的事情。我在下面回答。尽管我的方法看起来更糟,但我实际上发现使用 measure-command 时它的速度提高了约 2.5 倍@
  • 您的方式可行,而且肯定会更快,请注意,如果您不小心更改标题行/删除数据,如果您不小心替换了“,”,您的正则表达式可能会破坏 CSV 文件。等
【解决方案2】:

诀窍是使用get-content 将 csv 作为字符串导入。

$Good_CSV | export-csv $out -notypeinformation
$replaced=(gc $out).replace("X","")
$replaced|convertfrom-csv|export-csv $final_out -notypeinformation

在大字符串上使用正则表达式替换比在 csv 对象上简单得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-26
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2018-12-08
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多