如何在PowerShell中将CSV文件拆分为多个纯文本文件?

hk8txs48  于 2023-04-03  发布在  Shell
关注(0)|答案(1)|浏览(174)

我试图将CSV文件(Excel正确显示两列多行)拆分为多个纯文本文件。每行一个文件。这是我得到的程度:

$InputFilename = Get-Content 'csv-full.csv'

$OutputFilenamePattern = 'output_done_'

$LineLimit = 1

$line = 0

$i = 0

$file = 0

$start = 0

while ($line -le $InputFilename.Length) {

if ($i -eq $LineLimit -Or $line -eq $InputFilename.Length) {

$file++

$Filename = "$OutputFilenamePattern$file.txt"

$InputFilename[$start..($line-1)] | Out-File $Filename -Force

$start = $line;

$i = 0

Write-Host "$Filename"

}

$i++;

$line++

}

csv-full.csv是我的文件名。
我用这个方法的问题是,它为一个4行的CSV测试文件创建了几十个文件,第一个文件是头文件,其余的文件有些是空白的,其他的文件在同一行中有文本段落,但我不知道为什么被分成不同的文件。
请考虑第一列是标题,第二列是文本(在某些情况下是多个段落)。文本包括重音字符和符号(文本为西班牙语:?)真实的的CSV文件有数千行。

谢谢。如果可能的话,请确保输出文件是UTF-8编码的
编辑:
下面是CSV文件的几行纯文本:

Pregunta,Respuesta
¿Qué una casa?,"

Una casa es un edificio para habitar. El término suele utilizarse para nombrar a la construcción de una o pocas plantas que está destinada a la vivienda de una única familia, en oposición a los edificios de múltiples departamentos, apartamentos o pisos.

Por ejemplo: “Mi tía vive en una casa con jardín y piscina”, “Me encantaría mudarme a una casa, porque en el departamento me siento como encerrada”, “Los delincuentes ingresaron a la casa y amenazaron al matrimonio”.

"
¿Qué un pregunta?,"

El término pregunta tiene su origen etimológico en el latín. Y es que fruto de la suma de dos componentes de dicha lengua: el prefijo “pre-“, que significa “antes”, y el verbo “cunctari”, que puede traducirse como “dudar” o “demorar”.

Una pregunta es una interpelación que se realiza con la intención de obtener algún tipo de información. Al pronunciar esta interrogación, se espera recibir una respuesta que incluya los datos buscados.
oaxa6hgo

oaxa6hgo1#

由于您的CSV有多行字符串,如果没有CSV解析器,这样做会使任务变得非常困难,相反,您可以使用Import-Csv读取和解析它,然后Export-Csv将每行导出到单独的文件:

$outputfolder = 'path\to\outputFolder'
Import-Csv path\to\inputCsv.csv -Encoding utf8 | ForEach-Object { $i = 0 } {
    $path = Join-Path $outputfolder -ChildPath ('fileName-Part{0:D2}.csv' -f $i++)
    $_ | Export-Csv $path -NoTypeInformation -Encoding utf8
}

至于排除CSV标头,有2个选项,如果您使用PowerShell 7.4(预览版),您可以简单地使用-NoHeader,否则,您需要ConvertTo-Csv然后排除第一行并使用Set-Content导出:

$outputfolder = 'path\to\outputFolder'
Import-Csv path\to\inputCsv.csv -Encoding utf8 | ForEach-Object { $i = 0 } {
    $path = Join-Path $outputfolder -ChildPath ('fileName-Part{0:D2}.csv' -f $i++)
    $_ | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Set-Content $path -Encoding UTF8
}

相关问题