Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.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_Csv - Fatal编程技术网

Powershell 在文本文件中组织分类数据并转换为CSV的最快方法

Powershell 在文本文件中组织分类数据并转换为CSV的最快方法,powershell,csv,Powershell,Csv,我有一个数百行的文本文件。数据字段和值由冒号和分隔每个数据集的空行分隔。看起来像这样 icon:rain temperatureHigh:55.37 temperatureLow:42.55 humidity:0.97 windSpeed:6.7 precipType:rain precipProbability:0.97 icon:partly-cloudy-day temperatureHigh:34.75 temperatureLow:27.1 humidity:0.8 windSpee

我有一个数百行的文本文件。数据字段和值由冒号和分隔每个数据集的空行分隔。看起来像这样

icon:rain temperatureHigh:55.37 temperatureLow:42.55 humidity:0.97 windSpeed:6.7 precipType:rain precipProbability:0.97 icon:partly-cloudy-day temperatureHigh:34.75 temperatureLow:27.1 humidity:0.8 windSpeed:15.32 precipType:snow precipProbability:0.29 icon:clear-day temperatureHigh:47 temperatureLow:31.72 humidity:0.64 windSpeed:9.27 precipType:rain precipProbability:0.01 "icon","temperatureHigh","temperatureLow","humidity","windSpeed","precipType","precipProbability" "rain","55.37","42.55","0.97","6.7","rain","0.97" "partly-cloudy-day","34.75","27.1","0.8","15.32","snow","0.29" "clear-day","47","31.72","0.64","9.27","rain","0.01" ...and so on, and so forth. 图标:雨 温度高:55.37 温度下限:42.55 湿度:0.97 风速:6.7 降水类型:雨 准确度:0.97 图标:部分阴天 温度高:34.75 温度下限:27.1 湿度:0.8 风速:15.32 降水类型:雪 准确度:0.29 图标:晴天 气温高:47 温度下限:31.72 湿度:0.64 风速:9.27 降水类型:雨 精确度:0.01 我正在努力将其格式化为一个CSV格式,输出结果如下所示

icon:rain temperatureHigh:55.37 temperatureLow:42.55 humidity:0.97 windSpeed:6.7 precipType:rain precipProbability:0.97 icon:partly-cloudy-day temperatureHigh:34.75 temperatureLow:27.1 humidity:0.8 windSpeed:15.32 precipType:snow precipProbability:0.29 icon:clear-day temperatureHigh:47 temperatureLow:31.72 humidity:0.64 windSpeed:9.27 precipType:rain precipProbability:0.01 "icon","temperatureHigh","temperatureLow","humidity","windSpeed","precipType","precipProbability" "rain","55.37","42.55","0.97","6.7","rain","0.97" "partly-cloudy-day","34.75","27.1","0.8","15.32","snow","0.29" "clear-day","47","31.72","0.64","9.27","rain","0.01" ...and so on, and so forth. “图标”、“温度高”、“温度低”、“湿度”、“风速”、“精度类型”、“精度可能性” “雨”,“55.37”,“42.55”,“0.97”,“6.7”,“雨”,“0.97” “部分多云日”、“34.75”、“27.1”、“0.8”、“15.32”、“雪”、“0.29” “晴天”、“47”、“31.72”、“0.64”、“9.27”、“雨”、“0.01” …等等,等等。
我一直在尝试使用带有replace的
获取内容
,但是否可以使用
导入Csv
转换为Csv

regex
是一种方法:

$data = @'
icon:rain
temperatureHigh:55.37
temperatureLow:42.55
humidity:0.97
windSpeed:6.7
precipType:rain
precipProbability:0.97

icon:partly-cloudy-day
temperatureHigh:34.75
temperatureLow:27.1
humidity:0.8
windSpeed:15.32
precipType:snow
precipProbability:0.29

icon:clear-day
temperatureHigh:47
temperatureLow:31.72
humidity:0.64
windSpeed:9.27
precipType:rain
precipProbability:0.01

'@

$head = $data
$head = $head -replace '([^\s]+):([^\s]+)', '"$1",'
$head = $head -replace '\n\n', '::'
$head = $head -replace '\n', ''
$head = $head -replace '(.*?)::.*', '$1'
$head = $head -replace ',\s*$', ''
$head

$rows = $data
$rows = $rows -replace '([^\s]+):([^\s]+)', '"$2",'
$rows = $rows -replace '\n\n', '::'
$rows = $rows -replace '\n', ''
$rows = $rows + "::"
$rows = $rows -replace '::', "`n"
$rows = $rows -replace ',\s*\n', "`n"
$rows
输出:

"icon","temperatureHigh","temperatureLow","humidity","windSpeed","precipType","precipProbability"
"rain","55.37","42.55","0.97","6.7","rain","0.97"
"partly-cloudy-day","34.75","27.1","0.8","15.32","snow","0.29"
"clear-day","47","31.72","0.64","9.27","rain","0.01"

regex
是一种方法:

$data = @'
icon:rain
temperatureHigh:55.37
temperatureLow:42.55
humidity:0.97
windSpeed:6.7
precipType:rain
precipProbability:0.97

icon:partly-cloudy-day
temperatureHigh:34.75
temperatureLow:27.1
humidity:0.8
windSpeed:15.32
precipType:snow
precipProbability:0.29

icon:clear-day
temperatureHigh:47
temperatureLow:31.72
humidity:0.64
windSpeed:9.27
precipType:rain
precipProbability:0.01

'@

$head = $data
$head = $head -replace '([^\s]+):([^\s]+)', '"$1",'
$head = $head -replace '\n\n', '::'
$head = $head -replace '\n', ''
$head = $head -replace '(.*?)::.*', '$1'
$head = $head -replace ',\s*$', ''
$head

$rows = $data
$rows = $rows -replace '([^\s]+):([^\s]+)', '"$2",'
$rows = $rows -replace '\n\n', '::'
$rows = $rows -replace '\n', ''
$rows = $rows + "::"
$rows = $rows -replace '::', "`n"
$rows = $rows -replace ',\s*\n', "`n"
$rows
输出:

"icon","temperatureHigh","temperatureLow","humidity","windSpeed","precipType","precipProbability"
"rain","55.37","42.55","0.97","6.7","rain","0.97"
"partly-cloudy-day","34.75","27.1","0.8","15.32","snow","0.29"
"clear-day","47","31.72","0.64","9.27","rain","0.01"

下面是另一种使用简单正则表达式模式和字符串运算符组合的方法

$InStuff = @'
column1:value1
column2:value2
column3:value3
column4:value4
column5:value5

column1:value6
column2:value7
column3:value8 
column4:value9
column5:value10

column1:value11 
column2:value12
column3:value13 
column4:value14
column5:value15
'@


$SplitInStuff = $InStuff -split ([environment]::NewLine * 2)

$HeaderLine = ($SplitInStuff[0] -replace '(?m):.+$').Split([environment]::NewLine) -join ', '

$CSV_Text = [System.Collections.Generic.List[string]]::new()
$CSV_Text.Add($HeaderLine)

foreach ($SIS_Item in $SplitInStuff)
    {
    $CSV_Text.Add(($SIS_Item  -replace '(?m)^.+:').Split([environment]::NewLine).Where({$_}) -join ', ')
    }

$Results = $CSV_Text |
    ConvertFrom-Csv

# on screen
$Results |
    Format-Table

# to CSV
$Results |
    Export-Csv -LiteralPath "$env:TEMP\JohnnyCarino_ReformatedData.csv" -NoTypeInformation
输出

column1  column2 column3  column4 column5
-------  ------- -------  ------- -------
value1   value2  value3   value4  value5 
value6   value7  value8   value9  value10
value11  value12 value13  value14 value15
CSV文件内容

"column1","column2","column3","column4","column5"
"value1","value2","value3","value4","value5"
"value6","value7","value8 ","value9","value10"
"value11 ","value12","value13 ","value14","value15"

下面是另一种使用简单正则表达式模式和字符串运算符组合的方法

$InStuff = @'
column1:value1
column2:value2
column3:value3
column4:value4
column5:value5

column1:value6
column2:value7
column3:value8 
column4:value9
column5:value10

column1:value11 
column2:value12
column3:value13 
column4:value14
column5:value15
'@


$SplitInStuff = $InStuff -split ([environment]::NewLine * 2)

$HeaderLine = ($SplitInStuff[0] -replace '(?m):.+$').Split([environment]::NewLine) -join ', '

$CSV_Text = [System.Collections.Generic.List[string]]::new()
$CSV_Text.Add($HeaderLine)

foreach ($SIS_Item in $SplitInStuff)
    {
    $CSV_Text.Add(($SIS_Item  -replace '(?m)^.+:').Split([environment]::NewLine).Where({$_}) -join ', ')
    }

$Results = $CSV_Text |
    ConvertFrom-Csv

# on screen
$Results |
    Format-Table

# to CSV
$Results |
    Export-Csv -LiteralPath "$env:TEMP\JohnnyCarino_ReformatedData.csv" -NoTypeInformation
输出

column1  column2 column3  column4 column5
-------  ------- -------  ------- -------
value1   value2  value3   value4  value5 
value6   value7  value8   value9  value10
value11  value12 value13  value14 value15
CSV文件内容

"column1","column2","column3","column4","column5"
"value1","value2","value3","value4","value5"
"value6","value7","value8 ","value9","value10"
"value11 ","value12","value13 ","value14","value15"
试试这个:

$CurrentElement=[pscustomobject]@{}

#get all rows and add element list when row empty is founded
Get-Content "c:\temp\test.txt" | %{

    if ($_ -eq "")
    {
        $CurrentElement
        $CurrentElement=[pscustomobject]@{}
    }
    else
    {
       $Row=$_.split(':')
       Add-Member -InputObject $CurrentElement -MemberType NoteProperty -Name $Row[0] -Value $Row[1]
    }

}  | export-csv "c:\temp\result.csv" -notype

$CurrentElement  | export-csv "c:\temp\result.csv" -notype -Append
试试这个:

$CurrentElement=[pscustomobject]@{}

#get all rows and add element list when row empty is founded
Get-Content "c:\temp\test.txt" | %{

    if ($_ -eq "")
    {
        $CurrentElement
        $CurrentElement=[pscustomobject]@{}
    }
    else
    {
       $Row=$_.split(':')
       Add-Member -InputObject $CurrentElement -MemberType NoteProperty -Name $Row[0] -Value $Row[1]
    }

}  | export-csv "c:\temp\result.csv" -notype

$CurrentElement  | export-csv "c:\temp\result.csv" -notype -Append

最简单的方法是在两个连续的换行符处分割数据,并通过将数据块转换为哈希表(您还必须将
替换为
=
,这样才能工作)。然后可以将哈希表转换为自定义对象并导出为CSV

$data = Get-Content 'C:\path\to\input.txt' -Raw

$data -replace ':', '=' -split '\r?\n\r?\n' | ForEach-Object {
    [PSCustomObject]($_ | ConvertFrom-StringData)
} | Export-Csv 'C:\path\to\output.csv' -NoType
请注意,以上要求PowerShell v3或更高版本。对于较旧的PowerShell版本,您需要调整代码,如下所示:

$data = Get-Content 'C:\path\to\input.txt' | Out-String

$data -replace ':', '=' -split '\r?\n\r?\n' | ForEach-Object {
    $prop = $_ | ConvertFrom-StringData
    New-Object -Type PSObject -Property $prop
} | Export-Csv 'C:\path\to\output.csv' -NoType
如果希望CSV字段按特定顺序排列,可以在每个对象的
导出CSV
之间放置一个
选择对象

... | ForEach-Object {
    ...
} | Select-Object icon, temperatureHigh, ... | Export-Csv ...

Import Csv
要求将输入数据组织为每行一个数据集。它不能像您的输入数据那样用于键:值对块


转换为Csv
需要与上面示例代码中的
导出Csv
相同的准备工作。唯一的区别是输出没有写入文件。

最简单的方法是在两个连续的换行处分割数据,并通过将数据块转换为哈希表(您还必须将
替换为
=
,才能工作)。然后可以将哈希表转换为自定义对象并导出为CSV

$data = Get-Content 'C:\path\to\input.txt' -Raw

$data -replace ':', '=' -split '\r?\n\r?\n' | ForEach-Object {
    [PSCustomObject]($_ | ConvertFrom-StringData)
} | Export-Csv 'C:\path\to\output.csv' -NoType
请注意,以上要求PowerShell v3或更高版本。对于较旧的PowerShell版本,您需要调整代码,如下所示:

$data = Get-Content 'C:\path\to\input.txt' | Out-String

$data -replace ':', '=' -split '\r?\n\r?\n' | ForEach-Object {
    $prop = $_ | ConvertFrom-StringData
    New-Object -Type PSObject -Property $prop
} | Export-Csv 'C:\path\to\output.csv' -NoType
如果希望CSV字段按特定顺序排列,可以在每个对象的
导出CSV
之间放置一个
选择对象

... | ForEach-Object {
    ...
} | Select-Object icon, temperatureHigh, ... | Export-Csv ...

Import Csv
要求将输入数据组织为每行一个数据集。它不能像您的输入数据那样用于键:值对块


转换为Csv
需要与上面示例代码中的
导出Csv
相同的准备工作。唯一的区别是,输出没有写入文件。

这是一种用简单且希望清晰的代码来完成所需操作的方法。我没有使用复杂的PS对象、方法或函数,因此它是清晰和简单的。输入应位于名为in1.txt的文本文件中。我假设每组日期最多有7行(在遇到空格或文件结尾之前)。我没有把它变成通用的,或者包括错误检查等等。不用说,还有很多其他的方法可以做到这一点。如果你有任何意见,让我知道

#======================
# Function used by code
#======================

Function func-PrintSet
{

 $s1=''
 $del= ','
 $q='"'
 foreach ($element in $arr1) {
     $s1=$s1+$q+$element+$q + $del 
 }
 $s1

 $s1=""
 foreach ($element in $arr2) {
     $s1=$s1+$q+$element+$q +  $del 
 }
 $s1

}

#=====================
# Main code
#=====================

# simple initialization of arrays.

$arr1=0,0,0,0,0,0,0
$arr2=0,0,0,0,0,0,0
$i=-1
$reader = [System.IO.File]::OpenText("in1.txt")
while ($null -ne ($line = $reader.ReadLine())) 
{
    IF ($line)
    {

         $items = $line.split(':')
         $i=$i+1
         $arr1[$i]= $items[0]
         $arr2[$i]= $items[1]
    }
    ELSE
    {

        func-PrintSet   
        $i=-1
    }
}
func-PrintSet

"Done :)"

# Code end

这是一种用简单且希望清晰的代码实现您想要的功能的方法。我没有使用复杂的PS对象、方法或函数,因此它是清晰和简单的。输入应位于名为in1.txt的文本文件中。我假设每组日期最多有7行(在遇到空格或文件结尾之前)。我没有把它变成通用的,或者包括错误检查等等。不用说,还有很多其他的方法可以做到这一点。如果你有任何意见,让我知道

#======================
# Function used by code
#======================

Function func-PrintSet
{

 $s1=''
 $del= ','
 $q='"'
 foreach ($element in $arr1) {
     $s1=$s1+$q+$element+$q + $del 
 }
 $s1

 $s1=""
 foreach ($element in $arr2) {
     $s1=$s1+$q+$element+$q +  $del 
 }
 $s1

}

#=====================
# Main code
#=====================

# simple initialization of arrays.

$arr1=0,0,0,0,0,0,0
$arr2=0,0,0,0,0,0,0
$i=-1
$reader = [System.IO.File]::OpenText("in1.txt")
while ($null -ne ($line = $reader.ReadLine())) 
{
    IF ($line)
    {

         $items = $line.split(':')
         $i=$i+1
         $arr1[$i]= $items[0]
         $arr2[$i]= $items[1]
    }
    ELSE
    {

        func-PrintSet   
        $i=-1
    }
}
func-PrintSet

"Done :)"

# Code end

您的代码在哪里?导入Csv。\file.txt-标题栏1、栏2、栏3、栏4、栏5-分隔符“:“以前没有问过这个问题吗?@JohnnyCarino
Import Csv
与OP的输入格式不兼容。这看起来像是您的输出,而不是保存列表格式的输出,我想通过管道导出Csv。\your.Csv-NoTypeInformation
最终使用
-Append
参数。您的代码在哪里?导入Csv。\file.txt-标题栏1、栏2、栏3、栏4、,第5列-分隔符“:”这个问题以前没有问过吗?@JohnnyCarino
Import Csv
与OP的输入格式不兼容。这看起来像是您的输出,而不是保存列表格式的输出,我最终会使用
-Append
参数导出Csv。\your.Csv-NoTypeInformation
。谢谢。输出非常接近我所寻找的。我用实际数据编辑了我的原始帖子。希望helps@JohnnyCarino,如果你觉得答案有用,请给它打分并将其标记为答案。谢谢,谢谢。输出非常接近我所寻找的。我用实际数据编辑了我的原始帖子。希望helps@JohnnyCarino,如果你觉得答案有用,请给它打分并将其标记为答案。谢谢