如何仅使用PowerShell从引用字段中删除TAB-使用Import-CSV和Export-CSV

zengzsys  于 2023-07-31  发布在  Shell
关注(0)|答案(1)|浏览(134)

我只需要删除TAB分隔文件中的双引号内的TAB。我不知道如何检测实际字段的双引号与字符串本身的双引号。我不想意外地删除实际的TAB字段分隔符(当然)。
我有一个框架脚本,我 * 相信 * 我需要对$_ object/record做一些工作,但我不知道下一步是什么,检测所有字段,然后在不删除实际分隔符的情况下擦除任何TAB。我在CODE片段中放置了一个注解,说明我认为应该在何处处理数据字段。

原始数据

_record_number  record_id   id_testing  Notes   IntakeComplete
111 6   5   "           We will not be testing because of covid 19" 1
222 6   5   "           We will not be "testing because of covid 19"    1
333 6   5   "           We will not be "testing" because of covid 19"   1

字符串
最容易解决的情况是_record_number 111。我有一个记录,其中一个单双引号内的两个双引号内的标签。非常奇怪,所以我在_record_number 222中复制了这个问题。

代码

#-Import TABs Inside Quotes Issue.tsv

#-Declare File Paths
$SourceFile = "TABs Inside Quotes Issue.tsv"
$ExportFile = "TABs Inside Quotes Issue_Updated.tsv"

#---------- Attempt to find Double Quoted Fields and Remove TABs ONLY within them and therefore leaving the TAB delimiters untouched

Import-Csv $SourceFile -Delimiter "`t" | 
ForEach-Object {
    #-Process Data Fields Here
    $_
} |
Export-Csv $ExportFile -Delimiter "`t" -UseQuotes Never -NoTypeInformation


x1c 0d1x的数据
TL;DR
我使用上面的代码来修复我的数据问题的问题是,我正在修复每个字段的每个问题。如何对所有字段应用标准修复?也就是说,如何编写脚本来检查整行列,而不是在每列中编写代码,然后检查数据?
如果你好奇为什么我在Export-Csv中使用-UseQuotes Never,我这样做是因为BCP需要删除所有的引号,因为BCP实用程序无法处理引号字段。通过PowerShell Export-Csv Cmdlet导出CSV时使用-UseQuotes Never参数/值,它将删除几乎每个单引号,但它不会首先从引用字段中删除任何分隔符字符。对于中包含引号的Quoted字段,它有时也会产生意外结果。不管这个问题,是造成我的悲伤是标签内引用的领域,本身是通过标签分隔。

v8wbuo2f

v8wbuo2f1#

您可以使用两种替代方案,更强大的一种是解析Tsv,然后更新该列中的值:

Import-Csv $SourceFile -Delimiter "`t" | ForEach-Object {
    # update the property value
    $_.Notes = $_.Notes.Trim()
    # output the updated object
    $_
} | Export-Csv ....

字符串
第二个选项是以纯文本的形式读取内容,并直接在"之后修剪制表符,最后将字符串解析为对象:

(Get-Content $sourcefile -Raw) -replace '(?<=")\t+(?=.+")' |
    ConvertFrom-Csv -Delimiter "`t" |
    Export-Csv ...


有关正则表达式的详细信息,请参见https://regex101.com/r/W1lJgx/1
我建议您不要使用-UseQuotes Never,因为正如另一位用户在评论中所指出的那样,引号将在阅读Tsv时用作分隔符。在这种情况下,不需要ConvertFrom-Csv,只需返回Set-Content

(Get-Content $sourcefile -Raw) -replace '(?<=")\t+(?=.+")' |
    Set-Content $ExportFile

相关问题