导入csv列并将其替换为哈希值的问题

时间:2015-06-17 21:52:08

标签: powershell csv hash import

请注意,此数据已经过清理,以防止识别信息,并且从逗号之间删除了相当大的空白区域,以帮助提高可读性。最后在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]
}

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

2 个答案:

答案 0 :(得分:0)

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

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

输出:

Apple
Banana

答案 1 :(得分:0)

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

# 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列,而是&#34; TYPE&#34; (没有空格)。其他列也是如此。数据也受到影响。它不是459而是&#34; 459&#34;(没有空格)。

要修复此问题,我会检查文件并用逗号替换逗号周围的所有空格。

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]来避免整个问题,但你的一把钥匙叫做&#34; HS&#34;对我来说这看起来不像是一个数字:)。

我可能做了什么

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

# 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中的更改立即更新,但这应该足以满足您的需求。