【问题标题】:Delete spaces and column in csv with powershell使用powershell删除csv中的空格和列
【发布时间】:2015-03-10 14:50:29
【问题描述】:

我正在尝试使用 powershell 将下载的“.txt”文件转换为好看且有用的“.csv”文件。我很乐意完成这项任务,但在目标前不久,我遇到了一些我无法解决的问题。

它是一个包含 mac-addresses 的 OUI-Part 及其名称的列表。 这是它的样子(不带引号):

" 00-00-00   "  EMPTY COLUMN    "XEROX CORPORATION"
" 00-00-01   "  EMPTY COLUMN    "XEROX CORPORATION"

我现在的第一个问题是,我怎样才能去掉 OUI 地址列中的空格。第二个,空列怎么删。

最后应该是这样的(不带引号):

"00-00-00" "XEROX CORPORATION"
"00-00-01" "XEROX CORPORATION"

因此我们在第一列中包含不带任何空格的 OUI,在第二列中包含公司名称。但在这里,名称中有空格很重要。

原文件内容:

  00-00-09          XEROX CORPORATION
  00-00-0A          OMRON TATEISI ELECTRONICS CO.
  00-00-0B          MATRIX CORPORATION
  00-00-0C          CISCO SYSTEMS, INC.

我希望你能帮助我。

【问题讨论】:

  • 请用原始文本文件的文字内容更新您的问题。 (它不包含字符串“EMPTY COLUMN”,是吗?)
  • 你是对的,它不包含“EMPTY COLUMN”。我会更新这个问题。谢谢
  • 你也提到了MAC地址,但是MAC地址有六对数字,而不是三对。
  • 是的,对不起,这只是前 24 位,所以它是识别组织的部分(OUI(组织唯一标识符))

标签: file csv powershell space


【解决方案1】:

这是一种方法,使用Get-ContentSelect-String 和正则表达式来提取子字符串:

get-content "test.txt" | foreach-object {
  $_ | select-string '\s*((?:[0-9a-f]{2}-){2}[0-9a-f]{2})\s+(.+)$' | foreach-object {
    $oui = $_.Matches[0].Groups[1].Value
    $description = $_.Matches[0].Groups[2].Value
  }
  new-object PSObject -property @{
    "OUI" = $oui
    "Description" = $description
  } | select-object OUI,Description
}

对于包含双引号字符串的输出,将New-Object 替换为格式化字符串;例如:

get-content "test.txt" | foreach-object {
  $_ | select-string '\s*((?:[0-9a-f]{2}-){2}[0-9a-f]{2})\s+(.+)$' | foreach-object {
    $oui = $_.Matches[0].Groups[1].Value
    $description = $_.Matches[0].Groups[2].Value
  }
  '"{0}" "{1}"' -f $oui,$description
}

您可以使用诸如https://www.regex101.com/ 之类的正则表达式测试器来查看正则表达式(即Select-String 的参数)如何提取子字符串。

【讨论】:

  • 这些表情测试器很酷。我可以检查您的代码的每个表达式的作用。我对powershell很陌生,如何在文件中逐行编写O​​UI和描述?
  • 在我的示例代码的最后一行结束 } 字符之后添加 | export-csv "test.csv" -notypeinformation。这会将对象输出到 CSV 文件。
  • 可行,但现在看起来像这样:00-00-09,"XEROX CORPORATION" 00-00-0A,"OMRON TATEISI ELECTRONICS CO." 00-00-0B,"MATRIX CORPORATION" 但它不是制表符分隔的,并且有引号
  • 看起来更好,但是当我使用 '"{0}" "{1}"' -f $oui,$description 并随后使用 | export-csv "test.csv" -notypeinformation 将其写入 csv 文件时,文件看起来会很奇怪 Length 30 30 30 30 请原谅我糟糕的 powershell 技能,非常感谢为您提供帮助
  • 如果要使用格式化字符串,请不要使用Export-CSV。请改用| out-file "newfile.txt"。如果您想在列之间使用制表符,则格式化字符串将为'"{0}"`t"{1}"' -f $oui,description(即,将之间的空格替换为`t
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
相关资源
最近更新 更多