如何用PowerShell提取多文本文件指定行及元数据并合并为单文件
需求与问题
需要实现:遍历指定文件夹内的所有.lst文本文件,提取每个文件的第16行内容,再拼接上该文件的文件名和创建日期,最终将所有结果合并到一个新的文本/CSV文件中。
文件内容示例(所有文件格式统一)
BD C BEGIN_RUECKMELDUNG_FERTIGUNGAUFTRAG C ZA,MM,6 MM,AT,1,10,1,1,,"JOBNAME",,,T MM,AT,1,20,1,1,,"ORDER_DESCRIPTION",,,T MM,AT,1,30,1,1,,"PROGRAM_NAME",,,T MM,AT,1,40,1,1,,"DESIRED_QTY",,,Z MM,AT,1,50,1,1,,"CURRENT_QTY",,,Z MM,AT,1,60,1,1,,"SHEET_RUNTIME",,,Z MM,AT,1,70,1,1,,"SUPPLY_STOCK_NAME",,,T MM,AT,1,80,1,1,,"BATCH_NUMBER",,,T C ZA,DA,1 DA,'*','MACHINE','105759',1,1,869,'','*' <---- 需提取的行 C ENDE_RUECKMELDUNG_FERTIGUNGAUFTRAG C ED
期望输出示例(5个文件合并结果)
DA,'*','MACHINE','105759',1,1,869,'','*',filename,creationdate DA,'*','MACHINE','103423',1,1,234,'','*',filename,creationdate DA,'*','MACHINE','102562',1,1,2552,'','*',filename,creationdate DA,'*','MACHINE','105667',1,1,742,'','*',filename,creationdate DA,'*','MACHINE','105355',1,1,7332,'','*',filename,creationdate
当前已实现代码(无法整合)
两段独立代码分别实现了合并全部文件内容、提取文件名和日期,但无法整合为完整功能,也不知道怎么提取第16行:
合并全部文件内容的代码
$folder = 'Z:\Brun\Test\maquina1' $files = Get-ChildItem $folder\*.lst Get-Content $files | Set-Content $folder\MergedTxtFileMaquina1.txt
提取文件名和日期的代码
$folder = 'Z:\Brun\Test\maquina1' $files = Get-ChildItem $folder\*.lst $files | Select Name,CreationTime,LastWriteTime
解决方案
直接使用以下整合后的PowerShell代码即可完成需求:
$folder = 'Z:\Brun\Test\maquina1' $outputPath = Join-Path $folder "Merged_Results.csv" # 遍历目标文件夹下的所有.lst文件 Get-ChildItem $folder\*.lst | ForEach-Object { # 读取文件前16行并提取第16行(数组索引从0开始,对应索引15) $targetLine = (Get-Content $_.FullName -TotalCount 16)[15] # 拼接内容:目标行 + 文件名 + 格式化后的创建日期 "$targetLine,$($_.Name),$($_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss'))" } | Set-Content $outputPath -Encoding UTF8
代码说明
Get-ChildItem $folder\*.lst:获取目标文件夹内所有.lst格式的文件(Get-Content $_.FullName -TotalCount 16)[15]:仅读取文件前16行(比读取整个文件更高效),通过索引15定位到第16行内容$_.Name:获取当前处理文件的文件名$_.CreationTime.ToString('yyyy-MM-dd HH:mm:ss'):将文件创建日期格式化为标准化字符串,避免特殊字符干扰- 最终将所有拼接好的行写入指定的输出文件
内容的提问来源于stack exchange,提问作者Bruno Tesser
相关产品推荐
相关产品推荐

