使用Powershell将文本文件转换为csv文件

0 csv powershell

如果我有一个简单的文本文件,显示用户的名字、中间名(如果有)、姓氏和电子邮件地址,是否有一种快速方法可以使用 Powershell 甚至 Excel 将其转换为 csv 格式?CSV 文件只需显示名字、姓氏(可以是中间名和姓氏的组合)和电子邮件地址。

例如,如果我有一个如下文本文件:

James Tiberius Kirk       james.kirk@starfleet.com
Leonard McCoy             leonard.mccoy@starfleet.com
Run Code Online (Sandbox Code Playgroud)

我想按如下方式转换为 csv:

FirstName,LastName,EmailAddress
James,TiberiusKirk,james.kirk@starfleet.com
Leonard,McCoy,leonard.mccoy@starfleet.com
Run Code Online (Sandbox Code Playgroud)

除了手动之外,我不知道该怎么做,这对于大型文本文件来说非常耗时。

mkl*_*nt0 5

前言:

  • 解析此类数据的最可靠方法是了解纯文本文件中列的固定宽度或在列之间有明确的分隔符

  • 在您的情况下,可能两个或多个空格构成了这样的分隔符,但这不能从您的示例数据中推断出来。

  • 然而,最后一列值(电子邮件地址)从不包含空格,并且只有列允许明确的解析:最后一个以空格分隔的标记是电子邮件地址,之前的所有内容都是名称。


让我用一个解决方案来补充Mathias 的有用答案,该解决方案使用了罕见的PowerShell (Core) 7+功能(如果没记错的话,Mathias 自己甚至实现了该功能):

  • -split运算符接受负数以限制要返回的标记数量的能力,这会导致从每个输入字符串的末尾开始进行拆分。
# PS 7+ only
Get-Content file.txt | 
  ForEach-Object {
    # Split by one or more spaces into two tokens *from the end* (-2)
    # E.g., 'James Tiberius Kirk       james.kirk@starfleet.com' becomes
    #       @('James Tiberius Kirk', 'james.kirk@starfleet.com')
    $name, $email = $_ -split ' +', -2
    $first, $middleLast = -split $name
    [pscustomobject] @{
      FirstName    = $first
      LastName     = -join $middleLast
      EmailAddress = $email
    }
  } |
  ConvertTo-Csv # output to screen; replace with Export-Csv to save to file.
Run Code Online (Sandbox Code Playgroud)

  • 我应该更好地跟踪自己的特征:-P (3认同)