【问题标题】:Trim csv cell string with Powershell使用 Powershell 修剪 csv 单元格字符串
【发布时间】:2015-08-09 12:28:42
【问题描述】:

我在 csv 文件中的列上使用 .Trim() 函数时遇到问题。这个 csv 文件在整个表格中只包含一列,所以它应该非常简单(他说)。

我的 csv 中的数据,附件 A(注意:这都在一个字段/列中,而不是单独的列中):

Name
C:\Users\kgroome\Documents\NOC\Documentation\Chrome, .pdf
C:\Users\kgroome\Documents\NOC\Documentation\CLI, .docx
C:\Users\kgroome\Documents\NOC\Documentation\DNS, .pdf
C:\Users\kgroome\Documents\NOC\Documentation\Encryption, .pdf
C:\Users\kgroome\Documents\NOC\Documentation\Excel, .xlsx

理想情况下,我需要在字符串中的最后 5 个字符之后从右到左修剪所有内容,或者在 , 之后拆分,因为这样会更理想

我目前关于, 之后的拆分语法如下:

$data = Import-Csv "C:\Support\Test05.csv"

foreach($line in $data){

    $line.split(',')[5].Trim(); |

    Export-Csv -Path "C:\Support\Test06.csv"

 }

虽然这不是我最好的,但我以前有两种方法的语法,但是我已经废弃了它,因为它几乎没用。

非常感谢您的帮助,以便我知道我为什么会出错!

【问题讨论】:

  • Split() 方法创建一个数组。这意味着$line.split(',')[5] 表示“用逗号分割后的数组的第六项”,在这里几乎可以肯定是一个空值。我也很困惑为什么您要将文本文件导入 CSV,然后立即将其他内容保存到同一个变量,或者为什么您的 CSV 只有一个字段标题但似乎有两个字段。逗号是实际数据吗?
  • 在这里道歉@BaconBits,我没有复制和粘贴我的正确语法,我已经修改了这个现在让你指出我基本上创建了一个无用的“双变量”。关于我的 CSV,它确实只有一个字段标题,但数据都在一列中,它们不是单独的字段/列,所以要回答你的问题,是的 , 和之后的任何数据实际上是第一个字段。
  • 我不清楚您的预期输出。您是否只想要逗号前面的内容而放弃逗号后面的内容? Import-Csv 创建了一个对象数组,但您将其视为字符串数组
  • @Matt 差不多,, 之后的任何内容都是我的预期结果。您是否建议使用get-contentset-content 子句来避免将对象数组视为字符串数组?
  • 您的示例没有意义,您想用逗号分隔一行,但您使用的是 Import-Csv,它会为您完成此操作。您的示例有一个名为 $line 的变量 - 它是从哪里来的?

标签: arrays string shell powershell csv


【解决方案1】:

您使用 CSV 文件的事实有点牵强,我认为您想使用 split 的替换插入:

Get-Content "C:\Support\Test05.csv" | % {
    $_ -replace '\s*,\s*', ','
} | Set-Content "C:\Support\Test06.csv"

【讨论】:

  • 这成功了!非常感谢您的宝贵时间。 -Replace 开关确实比 .split 功能好得多,我现在知道它存在 :)
【解决方案2】:

我建议这样做只是为了帮助您了解您的代码在哪里无法正常运行。我仍然不完全确定你的输出应该是什么样子,并且有更好的方法来做到这一点(比如使用正则表达式)

$file = "c:\temp\text.csv"
$newfile = "c:\temp\text1.csv"

Get-Content $File | ForEach-Object{
    If($_ -match ","){
        $_.Split(",").Trim()[1]
    } Else {
        $_
    }
} | Set-Content $newfile

输出

Name
.pdf
.docx
.pdf
.pdf
.xlsx

Split 根据您指定的分隔符从字符串创建一个数组。使用您的示例数据拆分逗号只会创建一个包含 两个 元素的数组。使用5 请求第六个元素只会生成一个空值。

对于正则表达式解决方案,这足以在原始文件中生成相同的输出。

(Get-Content $File) -replace ".*,\s?" | Set-Content $file

这里的正则表达式将抓取所有字符,直到逗号以及以下空格(如果存在)。由于匹配要求逗号存在,因此跳过带有“名称”的第一行,因为它不匹配。

【讨论】:

  • 非常感谢您的输入 Matt,您帮助我更清楚地了解了我的代码在使用 Split 函数和 Foreach-Object 函数方面出错的地方比使用更有效一个循环。 Regex 解决方案也很棒,我不知道它存在,现在我将在未来更多地使用它!非常感谢您帮助我理解。
【解决方案3】:

也许是这样的:

gc "C:\Support\Test05.csv" | 
        % { $_.split(',')[-1].trim()} | 
                 set-content "C:\Support\Test06.csv"

【讨论】:

  • 这也很好用!非常感谢您抽出宝贵时间帮助我理解拆分方法。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 2017-03-10
  • 2014-01-17
  • 2018-07-04
  • 2017-09-20
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多