使用 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】:接下来是一个批处理文件解决方案,它的处理方式略有不同。
本质上,如果是奇数行,则输出内容后跟一个水平制表符,如果是偶数,则输出该行内容,然后是回车和换行。它还被编写为在输出以 ;
字符开头或包含 !
字符的内容时不会出现问题。
在测试之前,请仅将您在行 4
和 5
上的源文件和目标文件调整为您自己的绝对或相对文件名:
@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 列 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章