Parsing 如何在Powershell中解析csv列中的字符串

Parsing 如何在Powershell中解析csv列中的字符串,parsing,powershell,csv,substring,Parsing,Powershell,Csv,Substring,我已将csv配置为: PK,INV_AMT,DATE,INV_NAME,NOTE 1,123.44,634,asdfljk,TEST 12OING 06/01/2010 DATE: 04/10/2012 2,123.44,634,wet aaa,HI HOW ARE YOU 11.11 DATE: 01/01/2011 3,123.44,634,dfssdsdfRR,LOOK AT ME NOW….HI7&&& DATE: 06/11/1997 4,123.44,634,

我已将csv配置为:

PK,INV_AMT,DATE,INV_NAME,NOTE
1,123.44,634,asdfljk,TEST 12OING 06/01/2010 DATE: 04/10/2012
2,123.44,634,wet aaa,HI HOW ARE YOU 11.11 DATE: 01/01/2011
3,123.44,634,dfssdsdfRR,LOOK AT ME NOW….HI7&&& DATE: 06/11/1997
4,123.44,634,asdfsdgg,LOOK AT ME NOW….HI7&&& DATE: 03-21-2097
5,123.44,634,45746345,LOOK AT ME NOW….HI7&&& DATE: 02/18/2000
如何使用powershell解析Notes列中字符串“
date
:”之后的日期

例如,第一行的注释列中有字符串“
test12oing 06/01/2010日期:04/10/2012
”。我需要从那一行中解析“
04/10/2012

我想能够读取一个csv文件,如上面的一个,并解析出该日期,并将其添加为csv文件中的一个新列

感谢您的帮助。

由于
日期:
部分在末尾,您希望将其拆分为自己的部分,只需将
日期:
替换为
,即可工作:

# Open files for reading/writing line by line
$reader = New-Object System.IO.StreamReader("in.csv")
$writer = New-Object System.IO.StreamWriter("out.csv")

# Copy first line over, with an extra ",DATE"
$writer.WriteLine($reader.ReadLine() + ",DATE")

# Process lines until in.csv ends
while (($line = $reader.ReadLine()) -ne $null) {
    # Get index of last occurrence of "DATE: "
    $index = $line.LastIndexOf("DATE: ")

    # Replace last occurrence of "DATE: " with a comma
    $line = $line.Remove($index, 6).Insert($index, ',')

    # Write the modified line to the new file
    $writer.WriteLine($line)
}

# Close the file handles
$reader.Close()
$writer.Close()

如果
日期之前总是有空格:
,则将
日期:
替换为
日期:
可能会稍微好一些。

使用正则表达式的替代方法:

Get-Content in.csv |
# Perform a replace on each line with the DATE: pattern. For convenience,
# eliminate preceding whitespace.
Foreach-Object { $_ -replace "\s*DATE: (\d{1,2}[-/]\d{1,2}[-/]\d{2,4}).*",",`$1" } |
Set-Content out.csv

编辑:已更新,以响应OP关于删除日期后的零散字符的问题。

拆分Note属性的值(默认分隔符为空格),选择最后一个元素(-1)并将其强制转换为datetime对象。最后,将对象返回到管道($\中)


感谢ajk、bob和@shay levy的回答。。还有一件事。如果在日期之后有数据:“测试12OING 06/01/2010日期:04/10/2012 aaa测试123”,我如何才能提取相同的值“04/10/2012”。这是否与子字符串函数类似?谢谢。同样,有多种方法可以解决这个问题。因为我已经开始使用正则表达式,所以我坚持使用它并更新了我的答案。谢谢你的答案。还有一件事。如果在日期之后有数据:“测试12OING 06/01/2010日期:04/10/2012 aaa测试123”,我如何才能提取相同的值“04/10/2012”。这是否与子字符串函数类似?谢谢。请尝试使用正则表达式,将字符串替换为捕获的字符:“日期:”,然后替换到第一个空格之前的任何字符:“TEST 12OING 06/01/2010日期:04/10/2012 aaa TEST 123”-替换“^.+日期:([^\s]+).+$”,“$1”
Import-Csv test.csv | Foreach-Object { $_.Note = [datetime]$_.Note.Split()[-1]; $_}