使用正则表达式根据条件获取字符串的一部分
Get part of a string based on conditions using regex
我这辈子都想不出正则表达式字符的组合来解析我想要的字符串部分。该字符串是 for
循环的一部分,给出一行 40 万行(无序)。我通过与数组 for
循环传递的唯一数字匹配找到的字符串。
我试图为每个字符串获取日期编号(例如下面的 20151212
)。
给定以下字符串示例(从包含 400k++ 行字符串的 CSV 文件中提取):
字符串 1:
314513,,Jr.,John,Doe,652622,U51523144,,20151212,A,,,,,,,
字符串 2:
365422,johnd@blankity.com,John,Doe.,Jr,987235,U23481,z725432,20160221,,,,,,,,
字符串 3:
6231,,,,31248,U51523144,,,CB,,,,,,,
这里有几个并发症...
有些名字中有一个“,”,所以它超过了 15 个逗号。
我们不知道日期的值,只知道是(get-date).tostring("yyyyMMdd")
这样的日期格式
对于那些能想到更好的方法的人...
我们得到了两个要匹配的 CSV 文件。算法步骤:
在 CSV 文件 1 中查找 ID 号(在第二列中找到)
** 对于 CSV 文件 1
,ID 号不会为空
查看 CSV 文件 2 并匹配 CSV 文件 1 中的 ID 号。在同一行中,获取日期。一旦有日期,在 CSV 文件 1 的第 5 列追加与 ID 号相同的行
** 注意:对于 ID 中的某些值,CSV 文件 2 将包含 $null
数字列
我乐于接受建议(包括使用 Import-Csv cmdlet,其中我还不熟悉具有这些值的 for
循环的标志和语法)。
您可以尝试这样的操作:
,(19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]),
这将匹配从 1900 到 2099 的给定格式的所有日期。它也足够具体以排除大多数其他随机数,尽管没有更大的数据样本,这是不可能的。
然后在 PowerShell 中:
gc data.csv | where { $_ -match ",((19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])),"} | % { $matches[1] }
在 PowerShell 匹配中,我们在我们想要的内容周围添加了捕获括号,并通过 $matches 索引中的组编号引用该组。
如果您只对根据前面的 ID 匹配一行感兴趣,您可以使用回顾。例如,
$id=314513; # Or maybe U23481
gc c:\temp\reg.txt | where { $_ -match "(?<=$id.*),((19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])),"} | % { $matches[1] }
我这辈子都想不出正则表达式字符的组合来解析我想要的字符串部分。该字符串是 for
循环的一部分,给出一行 40 万行(无序)。我通过与数组 for
循环传递的唯一数字匹配找到的字符串。
我试图为每个字符串获取日期编号(例如下面的 20151212
)。
给定以下字符串示例(从包含 400k++ 行字符串的 CSV 文件中提取):
字符串 1:
314513,,Jr.,John,Doe,652622,U51523144,,20151212,A,,,,,,,
字符串 2:
365422,johnd@blankity.com,John,Doe.,Jr,987235,U23481,z725432,20160221,,,,,,,,
字符串 3:
6231,,,,31248,U51523144,,,CB,,,,,,,
这里有几个并发症...
有些名字中有一个“,”,所以它超过了 15 个逗号。
我们不知道日期的值,只知道是
(get-date).tostring("yyyyMMdd")
这样的日期格式
对于那些能想到更好的方法的人...
我们得到了两个要匹配的 CSV 文件。算法步骤:
在 CSV 文件 1 中查找 ID 号(在第二列中找到)
** 对于 CSV 文件 1
,ID 号不会为空
查看 CSV 文件 2 并匹配 CSV 文件 1 中的 ID 号。在同一行中,获取日期。一旦有日期,在 CSV 文件 1 的第 5 列追加与 ID 号相同的行
** 注意:对于 ID 中的某些值,CSV 文件 2 将包含 $null 数字列
我乐于接受建议(包括使用 Import-Csv cmdlet,其中我还不熟悉具有这些值的 for
循环的标志和语法)。
您可以尝试这样的操作:
,(19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01]),
这将匹配从 1900 到 2099 的给定格式的所有日期。它也足够具体以排除大多数其他随机数,尽管没有更大的数据样本,这是不可能的。
然后在 PowerShell 中:
gc data.csv | where { $_ -match ",((19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])),"} | % { $matches[1] }
在 PowerShell 匹配中,我们在我们想要的内容周围添加了捕获括号,并通过 $matches 索引中的组编号引用该组。
如果您只对根据前面的 ID 匹配一行感兴趣,您可以使用回顾。例如,
$id=314513; # Or maybe U23481
gc c:\temp\reg.txt | where { $_ -match "(?<=$id.*),((19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])),"} | % { $matches[1] }