使用CSV - DataSplits

时间:2016-09-05 08:43:58

标签: powershell csv import

我编写了一个脚本,从FTP服务器中提取大量CSV文件并下载到网络位置。

此CSV文件的内容遵循我在此链接中提供的示例 File Example

简而言之,我需要:

  • 使用第二行Ords:后面的12个字符(字母数字)定义一个稍后将在查询中使用的变量。 (A)

      

    GB0000000001

    会变成

    $OrderVariable = "GB0000000001"
    

    我已阅读

    .TrimStart([Characters_to_remove])
    

    但我不确定它会如何跳过第一行,然后如何在接下来的12个字母后删除所有内容。

  • 使用整行,除Ords:之外的两个信息将此定义为变量,例如

      

    GB0000000001 - 推广活动

    会变成

    $TitleEvent = "GB0000000001 – Promotion Event"
    

CSV包含电子邮件需要发送到的所有客户,例如

D|300123123|BBA
D|300321312|DDS
D|A0123950|BBA 
D|A0999950|ZZG

我希望将这些项目写入哈希表,我认为这个项目很简单,除非我找不到任何方法来排除它之前的所有内容。

$mytable   = Import-Csv -Path $filePath -Header D,Client,Suffix
$HashTable = @{}
foreach ($r in $mytable) {
    $HashTable[$r.Client] = $r.Data
}

更新

我已经设法通过以下

将大部分元素放入变量中
$target = "\\Messaging"

cd $target
$Clients = Import-Csv example.txt | where {$_ -like "*D|*"} 

$Clients = $Clients[1..($Clients.count - 1)]
$Clients | Export-Csv "Test.csv" -NoTypeInformation

但我无法使用自定义标头导入或没有第一个“H |”划界......

更新结束1

我认为这大致是需要的,因为在稍后的查询中我需要定义和使用的唯一元素是客户端本身。

  • 下一个将定义保留为消息内容的所有文本

      

    这是一项促销活动,需要您采取行动。在

         

    您的指示截止日期为2016年9月12日下午2点。

         

    此活动的截止日期已延长。

         

    要通知我们您的指示,您可以发送安全信息。

    这可能会在每次大量不同的情况下有所不同,因此不能简单地删除X行数,内容将始终遵循Ords:(第2行)并在D|分隔开始时结束。

我需要将大多数其他代码组合在一起我对“着名的最后一句话”非常有信心,并且有一个完整的脚本可以提取我需要的文件,我只是不擅长使用.csv的时候我有他们。

1 个答案:

答案 0 :(得分:1)

数据格式灵活,没有全局表格/网格结构,所以让我们使用正则表达式(breakdown),这是一种解析此类文本的通用方法。

$text = [IO.File]::ReadAllText('inputfile.txt', [Text.Encoding]::UTF8)

$data = ([regex]('ORDS: (?<order>.+?) [-–—] (?<title>.+)[\r\n]+' +
                 '(?<info>[\s\S]+?)[\r\n]+' +
                 '(?<clients>D\|[\s\S]+?)[\r\n]+' +
                 'T\|(?<T>\d+)')
    ).Matches($text) |
    forEach {
        $g = $_.groups
        @{
            order = $g['order'].value
            info = $g['info'].value -join ' '
            clients = $g['clients'].value -split '[\r\n]+' |
                where { $_ -match 'D\|(.+?)\|(.+)' } |
                forEach {
                    @{
                        id = $matches[1]
                        suffix = $matches[2]
                    }
                }
            T = $g['T']
        }
    }

$data现在是一条记录(如果文件有多个条目,则为记录数组):

Name                           Value
----                           -----
T                              000004
info                           This is a Promotion Event and action needs to be take...
order                          GB0000000001
clients                        {System.Collections.Hashtable, System.Collections.Has...

$data.clients是一系列记录:

Name                           Value
----                           -----
id                             300123123
suffix                         BBA
id                             300321312
suffix                         DDS
id                             A0123950
suffix                         BBA
id                             A0999950
suffix                         ZZG