首页 > 解决方案 > 导入-CSV,更改 1 个字段,然后导出

问题描述

我有以下格式的数据(制表符分隔):

Id      Dates                        Number
5       01-01-18<space><tab>         19
5       01-01-18 02-03-18            19
5       01-01-18 02-03-18 03-02-18   19
37      07-09-18                     19
37      07-09-18 07-15-18            19
37      07-09-18 07-15-18 07-28-18   18.1
41      03-15-18                     19
41      03-15-18 04-15-18            19
41      03-15-18 04-15-18 05-15-18   36.5

第二个字段Dates实际上是一个带有尾随空格的数组(以空格分隔)。

在修改第二个字段以仅包含最后日期后,我需要将其导入 PowerShell 并导出到新的 CSV 文件:

身份证日期号码
5 01-01-18 19
5 02-03-18 19
5 03-02-18 19
37 07-09-18 19
37 07-15-18 19
37 07-28-18 18.1
41 03-15-18 19
41 04-15-18 19
41 05-15-18 36.5

遍历记录后,除了错误之外,我什么也得不到(所以我没有半工作代码可以发布)。

CSV 文件可以包含多达 100,000 条记录。


所以到目前为止我已经得到了这个:

$ImportDir = "input_dir"
$ExportDir = "output_dir"

# We only want the files generated yesterday
$Date = (Get-Date).AddDays(-1).ToString('yyyyMMdd')

Add-Content ($ExportDir + "blahblah_" + $Date + ".txt") "Id`tDate`tValue"

Get-ChildItem $ImportDir -Filter *_blahblah_$Date.txt | ForEach-Object {
    $File = [System.IO.File]::ReadAllText((Resolve-Path $_.FullName))

    foreach ($RecordSet In $File) {
        $RecordSet.TrimEnd() -Replace "(\d+?)`t.*(\d\d-\d\d-\d\d) `t(\d+?.\d+?) `t", "`$1`t`$2`t`$3" |
            #Select-Object -Skip 1 |
            Add-Content ($ExportDir + "blahblah_" + $Date + ".txt")
    }
}

我转而使用[System.IO.File]它,因为它比它更快-ReadCount并且-ReadCount不知何故丢失了记录。最后一点我需要弄清楚的是如何跳过每个文件的第一行(基本上我正在对许多文件执行这个正则表达式并且需要删除标题)。似乎我所做的任何事情都会导致脚本无法正常工作。

标签: powershellcsv

解决方案


即使我认为您将需要使用StreamReader大文件,这就是我将如何使用Import-CSV. 请注意,它实际上是列中的最后一个日期,不一定是按时间顺序排列的最后一个日期 [ grin ] ...

# fake reading in a CSV file with tab delimiters
#    in real life, use Import-CSV
# each "Dates" column has a trailing <space>
$InStuff = @'
Id  Dates   Number
5   01-01-18    19
5   01-01-18 02-03-18   19
5   01-01-18 02-03-18 03-02-18  19
37  07-09-18    19
37  07-09-18 07-15-18   19
37  07-09-18 07-15-18 07-28-18  18.1
41  03-15-18    19
41  03-15-18 04-15-18   19
41  03-15-18 04-15-18 05-15-18  36.5
'@ | ConvertFrom-Csv -Delimiter "`t"

$LastDateOnly = foreach ($IS_Item in $InStuff)
    {
    [PSCustomObject]@{
        ID = $IS_Item.Id
        Date = $IS_Item.Dates.Trim().Split(' ')[-1]
        Number = $IS_Item.Number
        }
    }

$LastDateOnly

输出 ...

ID Date     Number
-- ----     ------
5  01-01-18 19    
5  02-03-18 19    
5  03-02-18 19    
37 07-09-18 19    
37 07-15-18 19    
37 07-28-18 18.1  
41 03-15-18 19    
41 04-15-18 19    
41 05-15-18 36.5  

推荐阅读