【问题标题】:Issues importing csv column and replacing it from hash value导入 csv 列并从哈希值替换它的问题
【发布时间】:2015-09-03 08:45:17
【问题描述】:

请注意,此数据已被清理以防止识别信息,并且逗号之间的大量空白已被删除以提高可读性。最后,在 TYPE 列的末尾有一行说明导出了多少行,希望脚本可以忽略这些行。

TYPE ,DATE ,TIME ,STREET ,CROSS-STREET ,X-COORD ,Y-COORD            
459 ,2015-05-03 00:00:00.000,00:58:35,FOO DR ,A RD/B CT , 0.0, 0.0
488 ,2015-05-03 00:00:00.000,02:31:54,BAR AV ,C ST/D ST , 0.0, 0.0

我正在尝试使用 Import-CSV 导入此 CSV,将 TYPE 数字代码转换为不同的字符串。一个例子是 459 变成了 Apple。 488变成香蕉等等。我创建了一个哈希,其中 TYPE 数字作为键,值是我想要更改的值。

所以我的问题实际上是双重的;到目前为止,我一直无法将 TYPE CSV 列导入到脚本中(我大部分时间都在尝试使用数组),并且我不确定构建逻辑以根据我的哈希检查数组数据的最佳方法键并将其替换为适当的值。

# declare filename to modify
$strFileName="test.csv"

# import the type data into its own array
$imported_CSV = Import-Csv $strFileName 

# populate hash
$conversion_Hash =  @{
            187 = Homicide;
            211 = Robbery;
            245 = Assault;
            451 = Arson;
            459 = Burglary;
            484 = Larceny;
            487 = Grand Theft;
            488 = Petty Theft;
            10851 = Stolen Vehicle;
            HS = Drug;
}

# perform the conversion
foreach ($record in $imported_CSV)
{
    $conversion_Hash[$record.Type]
}

这没有逻辑,只包含下面答案中提供的代码。请注意,我提到它在下面的 cmets 中不起作用。

【问题讨论】:

  • 是的....向我们展示您到目前为止所获得的,您可能离解决方案不远了
  • 您的真实数据是否包含类型列中的那些空格?我认为您的专栏将是type_ 而不仅仅是type。在 score 下是有显示空间的
  • 嗨,迈克尔。我回滚了您的编辑,以便人们可以清楚地看到问题和解决方案。我明白你在做什么,但它现在对其他人更有用。

标签: powershell csv hash import


【解决方案1】:

我认为这是您正在寻找的一个示例:

$hashTable = @{459= Apple; 488= Banana;} 
$csv = import-csv <file>
foreach($record in $csv)
{
$hashTable[$record.Type] #returns hash value
}

输出:

Apple
Banana

【讨论】:

  • 我注意到 foreach($record in $csv}
【解决方案2】:

所以我们这里有几个小问题。两个大的是你的源文件,你的哈希表键是整数而不是字符串。

# declare filename to modify
$strFileName="c:\temp\point.csv"

# import the type data into its own array
$imported_CSV = (Get-Content $strFileName) -replace "\s*,\s*","," | ConvertFrom-Csv

# populate hash
$conversion_Hash =  @{
            "187" = "Homicide";
            "211" = "Robbery";
            "245" = "Assault";
            "451" = "Arson";
            "459" = "Burglary";
            "484" = "Larceny";
            "487" = "Grand Theft";
            "488" = "Petty Theft";
            "10851" = "Stolen Vehicle";
            "HS" = "Drug";
}

# perform the conversion
foreach ($record in $imported_CSV)
{
    $conversion_Hash[$record.Type]
}

顽皮的人的输出

Burglary
Petty Theft

我不知道您的源文件是否与您的问题中的一样,但是那里有一堆空白会给您带来麻烦。也就是说,您没有 TYPE 列,而是“TYPE”(没有空格)。其他列也是如此。数据也会受到影响。不是 459 而是“459”(没有空格)。

为了解决这个问题,我检查了文件并将逗号周围的所有空格都替换为逗号。

TYPE,DATE,TIME,STREET,CROSS-STREET,X-COORD,Y-COORD            
459,2015-05-03 00:00:00.000,00:58:35,FOO DR,A RD/B CT,0.0,0.0
488,2015-05-03 00:00:00.000,02:31:54,BAR AV,C ST/D ST,0.0,0.0

如果您的数据已经看起来像这样,那么您需要小心地将这些内容发布到您的问题中。关于您比较的另一个问题

您会看到我引用了该哈希表中的几乎所有内容。我不得不为这些值,否则它们被视为命令。我还引用了键,因为 csv 表包含字符串而不是整数。我会直接投到[int] 以避免整个问题,但是你的一个键被称为“HS”,在我看来它不像一个数字:)。

我可能做了什么

只是为了玩一点,我可能会在名为TypeAsString 的列表中添加另一个注释属性,这将添加一列。

# perform the conversion
$imported_CSV | ForEach-Object{
    $_ |  Add-Member -MemberType NoteProperty -Name "TypeAsString" -Value $conversion_Hash[$_.Type] -PassThru
}

所以一个项目的输出应该是这样的

TYPE         : 459
DATE         : 2015-05-03 00:00:00.000
TIME         : 00:58:35
STREET       : FOO DR
CROSS-STREET : A RD/B CT
X-COORD      : 0.0
Y-COORD      : 0.0
TypeAsString : Burglary

我本可以创建一个更动态的属性,例如脚本属性,这样$conversion_Hash 中的更改会立即更新,但这应该足以满足您的需要。

【讨论】:

  • 好吧,在我的帖子的第一段中,我提到所有这些数据都已清除识别信息:) 我还提到我故意修剪空白以提高可读性。我没想到要修剪 CSV 本身中的空白,据我所知,这是一个很好的选择。我采纳了您的建议,最后使用 export-csv 命令完成了代码,并修改了转换逻辑以提交更改。感谢您的所有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 2013-07-21
  • 2014-01-23
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多