Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 在不同文件中保存.csv行_Powershell_Import Csv_Export Csv - Fatal编程技术网

Powershell 在不同文件中保存.csv行

Powershell 在不同文件中保存.csv行,powershell,import-csv,export-csv,Powershell,Import Csv,Export Csv,警告:PowerShell新手正在工作 我得到了一个.csv文件,我正试图将其过滤并拆分为不同的部分。 数据看起来像是s.th。像这样(更多真实的专栏) 我现在需要执行两个步骤: 第1步:筛选只有列4='400'的行的数据。我也只选了一些专栏,因为不是所有的专栏都对我感兴趣。并在这一点上添加一些自定义列 第二:根据column3是“50”还是“51”,将行拆分并保存在两个不同的文件中 $files = Get-ChildItem .\test\*.csv foreach ($file in $f

警告:PowerShell新手正在工作

我得到了一个.csv文件,我正试图将其过滤并拆分为不同的部分。 数据看起来像是s.th。像这样(更多真实的专栏)

我现在需要执行两个步骤:

第1步:筛选只有
列4
='400'的行的数据。我也只选了一些专栏,因为不是所有的专栏都对我感兴趣。并在这一点上添加一些自定义列

第二:根据
column3
是“50”还是“51”,将行拆分并保存在两个不同的文件中

$files = Get-ChildItem .\test\*.csv
foreach ($file in $files) {
    $fname = $file.Name
    $data = (Get-Content -path $file) | Select-Object -skip 1 | Foreach-Object {
        $_ -replace '\|',';'
    } | Set-Content -Path ".\test-out\${fname}"

    foreach ($rec in $data){
        $status = $rec.Substring(16,3)
        if ($status -eq "400"){
            Write-Warning "400 found"
            $csv400q = [PSCustomObject]@{
                'column 1' = $rec.'column 1'
                'column 2' = $rec.'column 2'
                'column 3' = $rec.'column 3'
                'column 4' = $rec.'column 4'
                'column 5' = $rec.'column 5'
                'column 6' = $rec.'column 6'
                'column 7' = $rec.'column 7'
                'new column1' = 'static text'
                'new column2' = 'static text'
                'new column3' = 'static text'
            }
            $csv400o += $csv400q
        }
    }
    $csv400o | Export-Csv -Path ".\test-out\${fname}" -Delimiter ";" -NoTypeInformation

    #Step #2 should be here
    foreach ($rec in $data) {
        $lunk = $rec.Substring(13,2)
        if ($lunk -like "50") {
            
        } elseif ($lunk -like "51") {
            
        }
    }
}
这些文件比这个示例大得多。但是对于这个样本数据,期望的结果是

file50.csv

column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
文件51.csv

column1; column2; column3; column4; column5; column6; column7
DATA;012594;51;400;1;312354684;38768449;
我只是使用了以前使用过的代码的一些部分。如果这是一个完全错误的方向-不要犹豫说


提前谢谢你

您的代码示例处理多个输入文件。您似乎理解文件I/O,但正如评论员已经指出的,您没有使用PowerShell中内置的CSV和对象处理

首先,为了简单起见,并使下面的代码易于测试,我们将从中读取您的示例数据

$YourData = @'
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
DATA;012594;50;401;1;456321564;53464554;
DATA;012594;50;402;1;321567894;54634858;
DATA;012594;51;400;1;312354684;38768449;
DATA;012594;51;410;1;123153167;54648648;
'@
# Treat the here-string as CSV data
$YourCSV = $YourData | ConvertFrom-Csv -Delimiter ";"
你的问题涉及两个步骤。使用
Where Object
进行过滤。
使用
Select Object
选择所需的列。
在一行的末尾使用backtick`

现在我们可以通过管道将$Step1变量的输出传输到CSV。首先再次使用
Where Object
对其进行过滤。由于您给出了两个具体案例(50和51),这就是下面演示的内容

#2nd: Split and save the rows in 2 different files depending whether column3 is '50' or '51'.
$Step1 | Where-Object column3 -EQ '50' | Export-Csv -Delimiter ";" -Path file50.csv -NoTypeInformation
$Step1 | Where-Object column3 -EQ '51' | Export-Csv -Delimiter ";" -Path file51.csv -NoTypeInformation
请注意,输出数据将像这样用引号括起来

"column1";"column3";"column4";"Col10";"Col11"
"DATA";"50";"400";"your text";"other text"

如果这有问题,有几种方法可以解决。

您的代码示例处理多个输入文件。您似乎理解文件I/O,但正如评论员已经指出的,您没有使用PowerShell中内置的CSV和对象处理

首先,为了简单起见,并使下面的代码易于测试,我们将从中读取您的示例数据

$YourData = @'
column1; column2; column3; column4; column5; column6; column7
DATA;012594;50;400;1;123456789;87986531;
DATA;012594;50;401;1;456321564;53464554;
DATA;012594;50;402;1;321567894;54634858;
DATA;012594;51;400;1;312354684;38768449;
DATA;012594;51;410;1;123153167;54648648;
'@
# Treat the here-string as CSV data
$YourCSV = $YourData | ConvertFrom-Csv -Delimiter ";"
你的问题涉及两个步骤。使用
Where Object
进行过滤。
使用
Select Object
选择所需的列。
在一行的末尾使用backtick`

现在我们可以通过管道将$Step1变量的输出传输到CSV。首先再次使用
Where Object
对其进行过滤。由于您给出了两个具体案例(50和51),这就是下面演示的内容

#2nd: Split and save the rows in 2 different files depending whether column3 is '50' or '51'.
$Step1 | Where-Object column3 -EQ '50' | Export-Csv -Delimiter ";" -Path file50.csv -NoTypeInformation
$Step1 | Where-Object column3 -EQ '51' | Export-Csv -Delimiter ";" -Path file51.csv -NoTypeInformation
请注意,输出数据将像这样用引号括起来

"column1";"column3";"column4";"Col10";"Col11"
"DATA";"50";"400";"your text";"other text"

如果这有问题,有几种方法可以解决。

我只是好奇。您不使用
Import Csv
读取Csv文件是否有特殊原因?$数据将变为空,因为它已写入文件。另外,CSV cmdlet肯定是首选。是的,非常简单:缺乏Powershell方面的知识/经验。谢谢你给我的提示,我只是好奇。您不使用
Import Csv
读取Csv文件是否有特殊原因?$数据将变为空,因为它已写入文件。另外,CSV cmdlet肯定是首选。是的,非常简单:缺乏Powershell方面的知识/经验。谢谢你的提示/正确的方向。太好了!为了适应我的ofc脚本,我做了很多调整,但这正是我想要的。非常感谢你!完美的为了适应我的ofc脚本,我做了很多调整,但这正是我想要的。非常感谢你!