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 xlsx到csv(包括格式化整列和替换特定列中的空单元格)_Powershell - Fatal编程技术网

Powershell xlsx到csv(包括格式化整列和替换特定列中的空单元格)

Powershell xlsx到csv(包括格式化整列和替换特定列中的空单元格),powershell,Powershell,我想让powershell comand执行以下操作-但我没有能力解决此问题:-) 理想的: 输入“file.xlsx” 输出“file.csv” (如果csv到csv太麻烦就可以了) 将“日期”列中日期为空的单元格设置为“xxx” 将列日期的字符从“.”格式化/替换为“-” 设置(如果需要)-编码utf8 谢谢既然您说“csv到csv很好”,那么如果您先将Excel文件导出到csv,您可以这样做: Import-Csv -Path 'D:\Test\file.csv' -UseCulture

我想让powershell comand执行以下操作-但我没有能力解决此问题:-)

理想的: 输入“file.xlsx” 输出“file.csv” (如果csv到csv太麻烦就可以了)

  • 将“日期”列中日期为空的单元格设置为“xxx”
  • 将列日期的字符从“.”格式化/替换为“-”
  • 设置(如果需要)-编码utf8
  • 谢谢

    既然您说“csv到csv很好”,那么如果您先将Excel文件导出到csv,您可以这样做:

    Import-Csv -Path 'D:\Test\file.csv' -UseCulture | 
        Select-Object Firm, Code, 
                      @{Name = 'Date'; Expression = {
                          if ([string]::IsNullOrWhiteSpace($_.Date)) { 'xxx' }
                          else { $_.Date.Replace('.', '-') }
                      }} |
        Export-Csv -Path 'D:\Test\new_file.csv' -UseCulture -Encoding UTF8 -NoTypeInformation
    
    我正在使用switch
    -UseCulture
    ,因此导入Csv和导出Csv都将使用Excel使用的相同分隔符


    编辑

    谢谢你的评论。从问题来看,不清楚真正的列标题是什么

    'Fulde navn'
    有一个额外的问题。因为它在Excel文件中是明确的单引号,当将其保存为CSV时,CSV中的头变成
    Fulde navn'
    。正如您所看到的,Excel删除了第一个单引号,但保留了结束引号

    您可以通过在保存为CSV之前在Excel中删除标题周围的这些引号,或者在代码中以
    “Fulde navn'
    的形式列出该标题来解决此问题

    在下面编辑的代码中,我使用了它(尽管我更喜欢删除原始Excel文件中的引号)

    为了保留字符
    æå
    ,我们还需要强制Excel导出UTF8,我找到的唯一方法是将其保存为
    Unicode文本(.txt)
    ,这将创建一个扩展名为.txt的制表符分隔文件

    在Excel中,选择
    另存为…
    并选择文件类型
    Unicode文本(.txt)Unicode



    编辑2(最终版本)

    当前代码:

    Import-Csv -Path 'D:\input.csv' -UseCulture |  
    
    Select-Object 'Virksomhedskode', 'Afdelingskode', 'Kode', 'Fulde navn', 'Stillingsbetegnelse', 'CPR-nummer', 'Bogføringsgruppekode', 'Ansættelsesdato',
                      @{Name = 'Fratrædelsesdato'; Expression = {
                          if ([string]::IsNullOrWhiteSpace($_.Fratrædelsesdato)) { 'xxx' }
                          else { $_.Fratrædelsesdato.Replace('.', '-') }
                      }} |
    
    Export-Csv -Path 'D:\edited.csv' -UseCulture -Encoding utf8 -NoTypeInformation
    

    谢谢。但我似乎对我的字符有问题。utf8和其他格式的字符都用“?”显示。我在列中有这些标题(包括æå)正确的标题是:Virksomhedskode,Afdelingskode,Kode,'Fulde navn',Stillingsbetegnelse,CPR nummer,Bogføringsgruppekode,Fratrædelsesdato,Ansættelssdato,Fratrædelsesdato is='Date',如果我试图将标题改为noneæåååå,似乎有效?有解决方案吗?@KasperM请参阅在我的回答中编辑。有两个与Excel相关的问题需要解决。很抱歉,有点不清楚。xlsx报告中没有引用标题“Fulde navn”。我只是在运行powershell命令时这样做的。很抱歉,保存txt文件似乎更让我吃惊。而且报告是自动生成的,因此如果需要打开文件并保存到txt,我们可以在excel中进行少量替换后,是否可以将文件保存到csv?或者我是否遗漏了什么?谢谢您的帮助。@KasperM否,保存到
    Unicode文本(.txt)
    保存为CSV,但这是Excel保存为UTF8的唯一方式。与“常规”CSV的唯一区别在于,字段由制表符分隔,而不是逗号。对于PowerShell,这一点都不麻烦。Excel以其蹩脚的导入/导出功能而闻名。每个人都希望能够使用自行选择的deli导出斜接字符和自行选择的编码,但helas,Excel就是它。@KasperM我已再次编辑了答案,并输入代码,直接使用.xlsx文件自动转换。这样,您就不必手动保存Excel文件。
    $Path = 'D:\Test\file.xlsx'
    
    Write-Host "Converting file '$Path'"
    
    # convert the Excel file to a temporary TAB-delimited Unicode file
    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false 
    $excel.DisplayAlerts = $false
    $workbook = $excel.Workbooks.Open($Path)
    $workbook.Worksheets.Item(1).Activate()
    
    # Excel up to and incuding version 2016, has no option to export csv format
    # in UTF8 encoding so we save as Unicode Text (*.txt)
    # this in fact is a Tab-delimited csv file, normally called '*.tsv', '*.tab' or simply '*.csv'
    
    # as of Excel 2019, you can try $xlCSVUTF8 = 62
    
    $xlUnicodeText = 42  # https://docs.microsoft.com/en-us/office/vba/api/excel.xlfileformat
    # save to a file with the same path and name, but a different extension
    $tempFile = [System.IO.Path]::ChangeExtension($Path, '.tab' )      
    $workbook.SaveAs($tempFile, $xlUnicodeText) 
    $workbook.Close()
    $excel.Quit()
    
    # important: cleanup used COM objects
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbook)
    $null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel)
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
    
    Write-Host "Creating new CSV file '$tempFile'"
    
    # read the exported .tab file, adjust the 'Fratrædelsesdato' field and
    # save as true CSV file in UTF8 encoding
    Import-Csv -Path $tempFile -Delimiter "`t" -Encoding Unicode | 
        Select-Object 'Virksomhedskode', 'Afdelingskode', 'Kode', 'Fulde navn', 
                      'Stillingsbetegnelse', 'CPR-nummer', 'Bogføringsgruppekode',
                      @{Name = 'Fratrædelsesdato'; Expression = {
                          if ([string]::IsNullOrWhiteSpace($_.Fratrædelsesdato)) { 'xxx' }
                          else { $_.Fratrædelsesdato.Replace('.', '-') }
                      }}, 'Ansættelsesdato' |
        Export-Csv -Path 'D:\Test\new_file.csv' -UseCulture -Encoding UTF8 -NoTypeInformation
    
    # you can now delete the temporary tab-delimited file
    Remove-Item $tempFile
    
    Import-Csv -Path 'D:\input.csv' -UseCulture |  
    
    Select-Object 'Virksomhedskode', 'Afdelingskode', 'Kode', 'Fulde navn', 'Stillingsbetegnelse', 'CPR-nummer', 'Bogføringsgruppekode', 'Ansættelsesdato',
                      @{Name = 'Fratrædelsesdato'; Expression = {
                          if ([string]::IsNullOrWhiteSpace($_.Fratrædelsesdato)) { 'xxx' }
                          else { $_.Fratrædelsesdato.Replace('.', '-') }
                      }} |
    
    Export-Csv -Path 'D:\edited.csv' -UseCulture -Encoding utf8 -NoTypeInformation