【问题标题】:Alternate-split CSV Column Using Powershell [closed]使用 Powershell 的备用拆分 CSV 列 [关闭]
【发布时间】:2021-05-30 02:07:14
【问题描述】:

任务应该很简单,但我不知道如何完成它。

假设我有一个 CSV 文件,其中包含以下一列数据(实际上有数百行,而不仅仅是六行)。

AAAAA BBBB 中国交建 DDDDDD EEEE FFFFF

使用 Powershell,我想从上述文件中自动创建一个新的 CSV 文件,该文件将数据拆分为以下两个制表符分隔的列。

AAAAA BBBBB 中交DDDDD EEEEE FFFFF

我怎样才能做到这一点?谢谢你

【问题讨论】:

    标签: powershell batch-file command csv


    【解决方案1】:

    接下来是一个批处理文件解决方案,它的处理方式略有不同。

    本质上,如果是奇数行,则输出内容后跟一个水平制表符,如果是偶数,则输出该行内容,然后是回车和换行。它还被编写为在输出以 ; 字符开头或包含 ! 字符的内容时不会出现问题。

    在测试之前,请仅将您在行 45 上的源文件和目标文件调整为您自己的绝对或相对文件名:

    @Echo Off
    SetLocal EnableExtensions DisableDelayedExpansion
    For /F "Delims==" %%G In ('"(Set {) 2>NUL"') Do Set "%%G="
    Set "{s}=C:\Users\Robith\Documents\input.csv"
    Set "{d}=C:\Users\Robith\Desktop\output.csv"
    If Not Exist "%{s}%" GoTo :EOF
    For /F %%G In ('Copy /Z "%~f0" NUL') Do Set "{r}=%%G"
    For /F "Delims==" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Call /?
     ^| %SystemRoot%\System32\find.exe "=="') Do Set "{t}=%%G"
    (Set {n}=^
    % 0x0A %
    )
    (   For /F Delims^=^ EOL^= %%G In ('Type "%{s}%"
         ^| %SystemRoot%\System32\find.exe /V ""') Do (
            Set /A {i} += 1, {m} = {i} %% 2
            Set "{l}=%%G"
            SetLocal EnableDelayedExpansion
            If !{m}! Equ 1 (Set /P "=!{l}!%{t}:~-1%"<NUL
            ) Else Set /P "=!{l}!%{r}%!{n}!"<NUL
            EndLocal)) 1>"%{d}%"
    For /F "Delims==" %%G In ('"(Set {) 2>NUL"') Do Set "%%G="
    

    【讨论】:

    • 这很棒。非常简单。我也可以在我的回答中加入这一点。我对批处理和 ps1 脚本都很陌生,所以您的详细说明非常有帮助。谢谢。
    【解决方案2】:

    您为第一个文件显示的不是 CSV 文件,而是一个文本文件,其中每个值都位于新行上。 您显然想要的结果是一个没有标题的制表符分隔文件。

    在 PowerShell 中,我认为最简单的方法是使用这样的索引循环:

    $fileA = Get-Content -Path 'Path\To\The\File'            # read the values as string array
    $result = for ($i = 0; $i -lt $fileA.Count; $i += 2) {   # loop through the lines in steps of 2
       "{0}`t{1}" -f $fileA[$i], $fileA[$i + 1]              # output the values delimited with a TAB character
    }
    
    # show in console window
    $result
    
    # write to file
    $result | Set-Content -Path 'Path\To\The\New\File'
    

    输出:

    AAAAA   BBBBB
    CCCCC   DDDDD
    EEEEE   FFFFF
    

    如果要创建带有标题的真实 CSV 文件,输出对象而不是字符串:

    $fileA = Get-Content -Path 'Path\To\The\File'            # read the values as string array
    $result = for ($i = 0; $i -lt $fileA.Count; $i += 2) {   # loop through the lines in steps of 2
        # output an object with column headers
        [PsCustomObject]@{ ColumnA = $fileA[$i]; ColumnB = $fileA[$i + 1] }
    }
    
    # show in console window
    $result
    
    # write to file
    $result | Export-Csv -Path 'Path\To\The\New\File' -Delimiter "`t" -NoTypeInformation
    

    输出:

    ColumnA ColumnB
    ------- -------
    AAAAA   BBBBB  
    CCCCC   DDDDD  
    EEEEE   FFFFF 
    

    【讨论】:

    • 这很好用。非常感谢。是的,我真正的问题是如何将值分成两列,无论是在 TXT 还是 CSV 文件中。只要我能将它们正确拆分,然后使用 Set-Clipboard 复制到剪贴板,我就很高兴了。以前,我必须将数据移动到 Excel 文件中,然后使用 =INDEX 公式手动分隔它们。但是有了这个 Ps1 脚本,我可以自动执行数据采集过程,而无需每次接触 Excel。也感谢带有标题指南的 CSV。我真的很感激。
    【解决方案3】:

    你使用了batch-file标签,所以我不得不假设,一个批处理文件解决方案是可以的。

    读取一行,记住它并仅在循环的每一秒运行一次时打印:

    @echo off
    setlocal enabledelayedexpansion
    set "first="
    for /f "delims=" %%a in (w.csv) do (
      if not defined first (
        set "first=%%a"
      ) else (
        echo !first! %%a
        set "first="
      )
    )
    if defined first echo %first% -----
    

    最后一行处理奇数行数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      相关资源
      最近更新 更多