【问题标题】:Separate one column to three (via PS)将一列分成三列(通过 PS)
【发布时间】:2017-06-29 08:29:29
【问题描述】:

在 CSV 文件中,我有一列中没有标题的数据,如下所示:

data1;data2;data3

data1;data2;data3

data1;data2;data3

我不知道如何通过 PowerShell 将其放在 CVS 或 XLSX 的 3 列中。 尝试了一些脚本,但结果始终相同 - 空文件或没有任何变化。

我的代码:

#Define locations and delimiter
$csv = "C:\TEMP\Loginy_Nieaktywne_temp.csv" #Location of the source file
$xlsx = "C:\TEMP\TEST.xlsx" #Desired location of output
$delimiter = ";" #Specify the delimiter used in the file

# Create a new Excel workbook with one empty sheet
$excel = New-Object -ComObject excel.application 
$workbook = $excel.Workbooks.Add(1)
$worksheet = $workbook.worksheets.Item(1)

# Build the QueryTables.Add command and reformat the data
$TxtConnector = ("TEXT;" + $csv)
$Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1"))
$query = $worksheet.QueryTables.item($Connector.name)
$query.TextFileOtherDelimiter = $delimiter
$query.TextFileParseType  = 1
$query.TextFileColumnDataTypes = ,1 * $worksheet.Cells.Columns.Count
$query.AdjustColumnWidth = 1

# Execute & delete the import query
$query.Refresh()
$query.Delete()

# Save & close the Workbook as XLSX.
$Workbook.SaveAs($xlsx,51)
$excel.Quit()

编辑

Import-Csv path/to/myfile.csv -Delimiter ";" | Export-Csv path/to/outputfile.csv

这对我不起作用,没有任何改变。我试过了,但在 Excel 中它们仍然在一列中。

【问题讨论】:

  • 你能告诉我们一些你试过的脚本吗?
  • 您已经有 3 列(它们用分号分隔)。请退后一步,描述您面临的实际问题。您在将其导入 Excel 时遇到问题吗?
  • 尝试$query.TextFileSemicolonDelimiter = $true 而不是$query.TextFileOtherDelimiter = $delimiterSee also.
  • 不幸的是,不起作用..

标签: excel powershell csv


【解决方案1】:

查看Import-CsvExport-Csv 的文档

Import-Csv path/to/myfile.csv -Delimiter ";" | Export-Csv path/to/outputfile.csv

根据ConnerLSW's comment-Header 参数可用于指定标头。否则 PowerShell 将自动使用第一行作为标题。

编辑
您的数据已经在 3 列中,由 ; 分隔。代码将其更改为 ,,这会创建一个标准文件,其中包含 Comma S 操作的 Values。当您打开文件时,Excel 可能无法识别这一点,具体取决于设置。

以编程方式,您可以在原始文件上使用Workbooks.OpenText,将Semicolon 参数设置为$true

在 GUI 中,您可以使用 Text-To-Columns 将单列转换为多列:

[

【讨论】:

  • 他在文件中没有任何标题,可能想记下-Header
  • @ConnorLSW 谢谢,已添加。
  • 我看到 Text to Columns 是这样做的关键。手动尝试并工作,但不知道如何将其放入 PS。
【解决方案2】:

如果文件名正确,我认为导入/导出不会失败

PS> Get-Content .\test.csv
data1;data2;data3

data1;data2;data3

data1;data2;data3

PS> import-csv .\test.csv -delimiter ';'

data1 data2 data3
----- ----- -----
data1 data2 data3
data1 data2 data3

PS> import-csv .\test.csv -delimiter ';' -header Col1,Col2,Col3

Col1  Col2  Col3
----  ----  ----
data1 data2 data3
data1 data2 data3
data1 data2 data3

PS> import-csv .\test.csv -delimiter ';' -header Col1,Col2,Col3|export-csv .\test2.csv -notype
PS> gc .\test2.csv
"Col1","Col2","Col3"
"data1","data2","data3"
"data1","data2","data3"
"data1","data2","data3"

如果你想摆脱 -Header

PS> Get-Content test2.csv| select -skip 1 |Set-content .\test3.csv
> Get-Content .\test3.csv
"data1","data2","data3"
"data1","data2","data3"
"data1","data2","data3"

【讨论】:

    【解决方案3】:
    $Header = "Header1,Header2,Header3"
    $Source = "C:\TEMP\Loginy_Nieaktywne_temp.csv"
    $OutFile = "C:\TEMP\Outfile.csv
    
    $header | Out-file $OutFile
    
    Get-content -Path $Source | Foreach {$_.Replace(";",",") | 
      Out-File $OutFile -Append}
    

    这将创建一个新文件,其标题列在第一行。 我们可以使用 get content 命令获取现有数据并将分号替换为逗号,将它们添加到新文件中,我们就有了一个正确构建的 CSV 文件。

    【讨论】:

    • 只有代码的答案质量不高。请编辑您的问题以解释您的代码的作用以及它如何解决问题。
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多