使用 Powershell 的备用拆分 CSV 列 [关闭]

Posted

技术标签:

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

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

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

AAAAA BBBB 中国交建 DDDDDD EEEE FFFFF

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

AAAAA BBBBB 中交DDDDD EEEEE FFFFF

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

【问题讨论】:

【参考方案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`t1" -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% -----

最后一行处理奇数行数。

【讨论】:

以上是关于使用 Powershell 的备用拆分 CSV 列 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 powershell 重新排序 CSV 列

PowerShell从csv文件中读取列值[重复]

使用拆分列将 RDD 写入 csv

使用PowerShell生成具有列方式数据的CSV而不是行方式

如何使用python从csv中的同一列拆分日期和时间?

在 PowerShell 中导出为 CSV 时如何指定列顺序?