【问题标题】:Read MAX values from CSV file without overwriting the existing values of the new CSV file从 CSV 文件读取 MAX 值而不覆盖新 CSV 文件的现有值
【发布时间】:2020-02-08 14:26:49
【问题描述】:

我的问题是我有一个包含未指定数量的 CSV 文件的文件夹。 应从此文件夹中读取每个 CSV 文件的 MAX 值,并将读取的 MAX 值写入新的 CSV 文件。 这是我当前的脚本,不幸的是我只能读取单个文件。

Import-CSV 'Folder-Path' -Delimiter ";" -Encoding Default | sort {[decimal]$_.Value} -Descending | select -F 1 | export-csv 'Folder-Path' -Delimiter ";" -NoType -Encoding Default -Append #>

此外,脚本不应覆盖新 CSV 文件中的 MAX 值 并且只有新 CSV 文件中还没有的 MAX 值。

要从中读取 MAX 值的 CSV 文件部分如下所示,包含 1000 多行:

 "Series"; "Time"; "Value"
 "Total Session Number";"2020-01-15 01:24";56
 "Total Session Number";"2020-01-15 01:26";59
 "Total Session Number";"2020-01-15 01:28";60
 "Total Session Number";"2020-01-15 01:30";60
 "Total Session Number";"2020-01-15 01:32";57
 "Total Session Number";"2020-01-15 01:34";58
 "Total Session Number";"2020-01-15 01:36";58

预期的结果应该是这样的:

"Series"; "Time"; "Value"
"Total Session Number"; "2020-01-15 17:36"; "197"

因为 CSV 文件并不总是相同的(example: file 1 is called session_access, file 2 is called session_number. "Series" name is for file 1 'session_access' and for file 2 "Series" name is 'session_number'), 将现有的 MAX 值与系列名称和时间进行比较。 我曾考虑借助数组或类似的东西来解决这个问题。 不幸的是,我不知道该怎么做。

我用于测试的示例文件:

第一个测试文件:

"Series"; "Time"; "Value" 
"Total Session Number"; "2020-01-25 01:00";59

第二个测试文件:

"Series"; "Time"; "Value"
"FactoryTest"; "2020-01-24 01:00";0

谁能帮我解决这个问题?

【问题讨论】:

  • 如何识别已写入生成的 CSV 文件的 MAX 值?你需要有一个标识符。您可以将源文件名包含到生成的 CSV 文件中,以便能够消除双峰并避免数据被覆盖。可能需要导入已经存在的 CSV 文件才能正确更新。
  • 我会通过系列名称和时间(日期)确定已经存在的最大值。我曾考虑借助数组或类似的东西来解决这个问题。不幸的是,我不知道该怎么做。
  • 如果您有有助于理解您的挑战的信息,您应该更新您的实际问题。 ...您喜欢通过系列名称来区分价值吗?在你的例子中,它们都是一样的!?! ;-) 您可以发布一些 csv 文件的示例内容,也可以发布这些 CSV 文件的名称,以显示您在说什么。 (请将这些示例数据也格式化为代码)
  • 好的,我会的。
  • 这些值是每列中的第三个值吗?

标签: powershell


【解决方案1】:

好的,我仍然不确定我是否得到了你真正想要做的事情。还是试试吧:

因为您显然是在尝试混合不同的数据集,所以您必须做一些小技巧。假设您要放入“系列”类别中的数据列都以“会话”一词开头,您可以尝试这样做:

$Directory = 'Folder-Path'
$Result = Get-ChildItem -Path $Directory -Filter 'session*.csv' |
    ForEach-Object {
        $InputData = Import-Csv -Path $_.FullName -Delimiter ';' |
            Sort-Object -Property {[decimal]$_.Value} -Descending |
                Select-Object -First 1 
        [PSCustomObject]@{
            Series = $InputData.Series
            Time = $InputData.Time
            Value = $InputData.Value
        }
    }
$Result
$Result | Export-Csv -Path 'path to your results CSV file' -Delimiter ';' -NoTypeInformation

首先,您指定要使用的路径。然后收集所有 CSV 文件并使用 Import-Csv 导入它们。您对 CSV 文件中的数据进行排序以获得所需的值,然后选择第一个。 现在创建一个新数据集,在其中添加源文件名,以便能够识别源数据的来源。然后您将不同的“会话”事物数据“转换”为数据单元“系列”。

这是你需要的吗?

当然,您可以以任何您想要的方式输出数据,或者采取一些进一步的步骤将它们导出到新的 CSV 文件或其他文件中。 ;-)

【讨论】:

  • 您好,感谢您的帮助。每当我尝试在自己身上运行代码时,我总是会遇到错误。那么“结果”导出到哪里呢?
  • 在输出中我得到源文件输出。这不是必需的,但“会话”名称应显示为“总会话数”。不幸的是,我无法将输出转换为新的 CSV 文件。
  • 我看不到你的屏幕。因此,您必须更具体地了解错误.. ;-) 在我的代码建议中,结果未导出。如果您想指定您的要求,请使用详细信息更新您的问题。 ...当然,您可以根据需要更改我的代码建议。
  • 错误消息:选择对象:找不到属性“会话 *”。在 line:9 char:35 + ... 系列 = $InputData | Select-Object -ExpandProperty Session* + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument : (@{Series=Online...:18; Value=202}:PSObject) [Select-Object], PSArgumentException + FullyQualifiedErrorId : ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
  • 如何将代码中的结果导出到新的 CSV 文件?
猜你喜欢
  • 2019-09-23
  • 2018-03-08
  • 2019-01-30
  • 2015-07-27
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2019-06-04
  • 1970-01-01
相关资源
最近更新 更多