【问题标题】:Split data from a text file 8 times to put in CSV in individual rows将文本文件中的数据拆分 8 次以将 CSV 放入单独的行中
【发布时间】:2017-12-08 22:47:23
【问题描述】:

我需要从文本文件中读取一些数据并生成 CSV。

我正在使用这个 PowerShell 脚本来获取数据

$PAGE = Get-Content .\DATA.txt | ForEach-Object {
     New-Object PSObject -Property @{
         FIELD1 = [regex]::Matches($_, '^[^\:]*[^\.txt:]').Value
         FIELD2 = [regex]::Match($_, 'DATA').Value
         FIELD3 = [regex]::Match($_, 'DATA\s(.+)').Value
         FIELD4  = [regex]::Match($_, 'DATA\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s')
     }
}

$PAGE | Select-Object FIELD1, FIELD2, FIELD3, FIELD4 |
    Export-Csv DATA.csv -NoTypeInformation

正则表达式可以测试here。示例输入:

file1.txt:数据 46546 TEST1 EUIRWY 283746827 2 1 3 3 file2.txt:数据 96873 TEST2 KJH-ASKDJH 928374 0 0 0 0

上述脚本对给定数据的输出如下:

字段1 |字段2 |字段3 | FIELD4 文件1 |数据 |数据 46546 TEST1 EUIRWY 283746827 2 1 3 3 | FIELD4 文件2 |数据 |数据 96873 TEST2 KJH-ASKDJH 928374 0 0 0 0 | FIELD4

但预期的输出是这样的。

字段1 |字段2 |字段3 | FIELD4 文件1 |数据 | D1 | 46546 文件1 |数据 | D2 |测试1 文件1 |数据 | D3 | EUIRWY 文件1 |数据 | D4 | 283746827 文件1 |数据 | D5 | 2 文件1 |数据 | D6 | 1 文件1 |数据 | D7 | 3 文件1 |数据 | D8 | 3 文件2 |数据 | D1 | 96873 ................................... ................................... ..........所以没有 8 次

Field4 基本上总是有 8 个字符串或数字 FIELD1 应该是文件名 8 次 FIELD2 也将出现 8 次 'DATA' 并且 FIELD3 将始终遵循这个序列 D1....D8。对 DATA.TXT 文件中的每一行都要重复相同的操作。所以在示例中,我取了 2 行作为 file1.txt 和 file2.txt。

我想不出应该如何进行。因为我想在脚本中使用类似的方法,因为它是我的主脚本的一部分,为了统一起见,我想尽可能使用这种方法。

【问题讨论】:

  • 请提供示例输入。
  • @Ansgar Wiechers 测试字符串已经存在link
  • 请在您的问题中提供与您的问题相关的所有内容。我不太愿意去其他地方回答你的问题。

标签: regex powershell csv


【解决方案1】:

我会在Where-Object 过滤器中进行匹配,并在嵌套在ForEach-Object 内的for 循环中构造所需的对象:

$re = '^(.*?\.txt):\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$'
$PAGE = Get-Content .\DATA.txt | Where-Object {
    $_ -match $re
} | ForEach-Object {
    for ($i=3; $i -lt $matches.Count; $i++) {
        New-Object PSObject -Property @{
            FIELD1 = $matches[1]
            FIELD2 = $matches[2]
            FIELD3 = "D$($i-2))"
            FIELD4 = $matches[$i]
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多