【问题标题】:Append CSV using Comparisons of CSV Files使用 CSV 文件比较附加 CSV
【发布时间】:2016-03-22 02:18:45
【问题描述】:

我正在尝试使用两个 csv 的比较将数据输入到一个 csv 中。数据是两个 csv 比较的结果。

例如:

CSV 1 说

Host,Type
Host1,Server
Host2,Switch
Host3,Hub
Host4,Router

CSV 2 说:

List of Types, Hosts
              ,Host1 random letters Host2
              ,random letters Host3 Host2
              ,Host4 Host3 Host2

输出应该是

List of Types,Hosts
server switch,Host1 random letters Host2
hub switch,random letters Host3 Host2
router hub switch,Host4 Host3 Host2

这就是我所拥有的:

我的问题似乎是比较部分

  $CSV1 = Import-Csv "Pathname1.csv"

Foreach ($title in $CSV1)
{
    $Hosts =$title."Hosts"
    $Type=$title."Type"
}

$csv2 = Import-Csv "Pathname2.csv"

foreach($title in $CSV2)
{
    $Typelist = $title."List of Types"
    $Hostlist = $title."Hosts"

    if ($Hostlist -contains $Hosts)
    {
    $title.'List of Types'= $Type
    }
 }

 $csv2 | export-csv "export.csv"

除了原来的东西外,什么都没有输出。

【问题讨论】:

  • 你得到什么样的输出?这通常可以提供有关问题性质的线索。
  • List of Types 下没有显示任何内容。但是,如果我在没有 IF 声明的情况下执行 $title.'List of Types'="This is blank"... 所有行都会显示 This is blank
  • 为什么 $csv1 和 $csv2 导入的是同一个文件?另外,您的问题中 csv2 的内容是否准确地格式化了文件中的行和列(又名,无类型)?
  • 我将文件名更改为不同的。我正在使用 2 个不同的 csv。我不确定我是否理解你的最后一个问题,但我的文件确实看起来像那样......所以它在主机名之间有随机字符串
  • 如果你没有 ' ; ' 在每个函数声明的末尾,还是这个脚本由缩进驱动?

标签: csv powershell comparison-operators


【解决方案1】:

您的 csv 文件的组织方式对我来说确实没有多大意义,但这并不意味着您的问题无法通过一些思考和学习如何分解您的问题并逐步通过调试器使其工作来解决.

我已经编写了一些代码来提供所需的输出,甚至添加了几行可能有用的调试语句(输出),可以取消注释以查看进度。

CSV1

Host,Type
Host1,Server
Host2,Switch
Host3,Hub
Host4,Router

CSV2

List of Types,Hosts
,Host1 random1 letters1 Host2
,random2 letters2 Host3 Host2
,Host4 Host3 Host2

代码

"-=-=-=-=-=-=-= start"

$content1 = Get-Content d:\junk\c1.csv
$data1 = $content1 | ConvertFrom-Csv -Header @('Host','Type')
"c1===="
$content1
"csv1===="
$data1 | ft

$content2 = Get-Content d:\junk\c2.csv
$data2 = $content2 | ConvertFrom-Csv -Header @('Type','Hosts')
"c2===="
$content2
"csv2===="
$data2 | ft

#"data===="
$output = @()
foreach ($hostList in ($data2.Hosts | select -Skip 1)){
    # don't use variable name $host. it is a reserved variable.
    # see about_Automatic_Variables
    # https://technet.microsoft.com/en-us/library/hh847768.aspx
    $subHosts = $hostList -split ' '

    #"subhosts===="
    #$subHosts

    $types = @()
    foreach ($subHost in $subHosts)
    {
        #$("sh = $subHost")
        $typeMatch = (($data1 | select -Skip 1) | where {$_.Host -eq $subHost}).Type

        if ($typeMatch)
        {
            $types += $typeMatch
        }
    }
    $types = $types -join ' '

    #"types===="
    #$types

    $matches = @{}
    $matches.Add($types, $hostList)
    $output += $matches
}

"final list===="
$output

"-=-=-=-=-=-=-=- end"

输出

-=-=-=-=-=-=-= start
c1====
Host,Type
Host1,Server
Host2,Switch
Host3,Hub
Host4,Router
csv1====

Host  Type  
----  ----  
Host  Type  
Host1 Server
Host2 Switch
Host3 Hub   
Host4 Router

c2====
List of Types,Hosts
,Host1 random1 letters1 Host2
,random2 letters2 Host3 Host2
,Host4 Host3 Host2
csv2====

Type          Hosts                       
----          -----                       
List of Types Hosts                       
              Host1 random1 letters1 Host2
              random2 letters2 Host3 Host2
              Host4 Host3 Host2           

final list====

Name              Value                       
----              -----                       
Server Switch     Host1 random1 letters1 Host2
Hub Switch        random2 letters2 Host3 Host2
Router Hub Switch Host4 Host3 Host2           
-=-=-=-=-=-=-=- end

【讨论】:

  • 这是一个很好的答案和解释,但是它不适用于我的实际数据。两者的区别在于我的主机和号码之间有空格。如果我在 Hosts 下的 CSV 2 中有 Host 2 一词,我该如何匹配让我们说 CSV1 中的 Host 2Switch
  • 问题是您正在为您的主机使用“Host1 随机字母 Host2”之类的项目,这意味着空格作为分隔符。然后,您不能尝试在项目中使用该分隔符,除非您将其放在引号或类似的东西中(例如,'Host1' 'random' 'letters' 'Host2')。我不确定你是如何获得这些数据的,你打算用它做什么,但可能有更好的方法。建议您针对您的项目所要求的任何最佳实践(数据结构、设计模式、工作示例代码)进行一些研究。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多