อ่านไฟล์, แยกตัวอักษร, ต่อท้ายทุกบรรทัด, ตัดส่วนหัว & ท้ายกระดาษ, เชื่อมไฟล์ทั้งหมด


1

ฉันมีไฟล์ข้อความ ASCII ชุดใหญ่ที่ฉันต้องแก้ไขด้วยเนื้อหาที่พบในไฟล์จากนั้นทำการต่อไฟล์ทั้งหมดให้เป็นไฟล์สรุปหนึ่งไฟล์ ฉันประสบความสำเร็จพอสมควรโดยใช้วิธีการทีละขั้นตอนจนถึงตอนนี้ แต่ฉันต้องการทำสิ่งนี้ในคราวเดียวและไม่สามารถเข้าใจได้ ฉันเขียนสคริปต์ใน PowerShell ซึ่งจะทำสิ่งที่ฉันต้องการสำหรับไฟล์เดียว แต่ฉันไม่สามารถหาวิธีแก้ไขมันสำหรับไฟล์ทั้งหมดในโฟลเดอร์ ฉันกำลังดิ้นรนกับการวนซ้ำและส่วนการต่อข้อมูลไฟล์สุดท้าย

นี่คือโครงสร้างไฟล์พื้นฐานของฉัน:

File1.txt

บรรทัดที่ 1 - abc123 - ส่วนหัว (ฉันต้องการตัดอักขระ 2,3 & amp; 4 จากที่นี่และเพิ่มลงในบรรทัดข้อมูล)
Line2 - data1
Line3 - data2
LineN - abc123 - ส่วนท้าย (ซ้ำกันของส่วนหัว)

File2.txt

บรรทัด 1 - efg456
Line2 - data3
Line3 - data4
LineN - efg456

FileN.txt

บรรทัด 1 - hij789
Line2 - data5
Line3 - data6
บรรทัด N - hij789

ฉันต้องการไฟล์ที่ส่งออกสุดท้ายที่จะมีโครงสร้างต่อไปนี้โดยมีการลบส่วนหัวและท้ายกระดาษและเนื้อหาที่แยกจากส่วนหัวในคอลัมน์ใหม่ที่จุดเริ่มต้นของไฟล์ (เหล่านี้เป็นไฟล์ความกว้างคงที่):

Final.txt

บรรทัด 1 - bc1data1
บรรทัด 2 - bc1data2
บรรทัดที่ 3 - fg4data3
บรรทัด 4 - fg4data4
Line5 - ij7data5
บรรทัด 6 - ij7data6

ฉันสามารถแก้ปัญหานี้สำหรับไฟล์เดียวและใส่รหัสด้านล่าง:

cd "C:\Data\Files\"
$S1 = Get-Content File1.txt -First 1
$S2 = $S1.Substring(2,3)
Get-Content File1.txt | ForEach-Object {Add-Content a.txt "$S2$_"}
Get-Content a.txt | Select -Skip 1 | Select -SkipLast 1 | Set-Content out.txt
# extract header line
# limit to characters of interest
# append to the beginning of each line in file
# append all files together w/o first & last line

เป็นการดีที่ฉันสามารถทำได้โดยไม่ต้องใช้ไฟล์ขยะ a.txt ด้วย แต่ฉันก็สามารถทำงานได้โดยการเขียนไปยังไฟล์แยกต่างหาก ข้อเสนอแนะ / เคล็ดลับใด ๆ ที่จะได้รับการชื่นชมในขณะที่ฉันค่อนข้างใหม่กับ PowerShell (ไม่กี่ชั่วโมงของการปฏิบัติ)

คำตอบ:


0
## Q:\Test\2017\08\25\SU_1244148.ps1

Set-Location "C:\Data\Files\"
$Files = Get-ChildItem File*.txt
$Final = ForEach ($File in $Files){
    $Content = Get-Content $File
    $Prefix = $Content[0].Substring(1,3)
    For ($i = 1;$i -lt $Content.Length-1;$i++){
         "{0}{1}" -f $Prefix,$Content[$i]
    } 
} 
$Final | Set-Content Final.txt

> gc .\Final.txt
bc1data1
bc1data2
fg4data3
fg4data4
ij7data5
ij7data6

เวอร์ชัน 2 จัดการไฟล์ขนาดใหญ่

## Q:\Test\2017\08\25\SU_1244148_2.ps1
#Set-Location "C:\Data\Files\"

$Files = (Get-ChildItem File*.txt|Sort)
$Final = '.\Final.txt'

## As we append to $Final initially clear
If (Test-Path $Final){Remove-Item $Final}

ForEach ($File in $Files){
    $Reader = [IO.File]::OpenText($File)
    $Header = $Reader.ReadLine()
    $Prefix = $Header.SubString(1,3)
    $Line = $Reader.ReadLine()
    while ($Reader.Peek() -ge 0) {
        $Prefix+$Line| Out-File $Final -Append
        $Line = $Reader.ReadLine()
    }
    $Reader.Dispose()
} 

รหัสที่ปรับให้เหมาะสมเพื่อไม่ต้องทดสอบสำหรับส่วนหัวต่อท้าย
ในขณะที่ห่วงพิมพ์บรรทัดก่อนหน้าและอ่านวิธีต่อไปนี้วางบรรทัดสุดท้าย


ขอบคุณ @LotPings มันใช้งานได้ดีมากในไฟล์ทดสอบขนาดเล็ก แต่ทันทีที่ฉันรันไฟล์ขนาดใหญ่มันจะโยนข้อยกเว้นหน่วยความจำออกมา
Karl

ใน คำถาม & amp; A นี้ดังนั้น เป็นแนวคิดที่จะจัดการกับไฟล์ขนาดใหญ่ ดูรุ่นสคริปต์ที่ 2 ต่อท้าย คุ้มค่า upvote ;-)
LotPings

ฉันเชื่อเรื่องนี้สักหน่อยแล้ววนกลับมาตอนนี้ เวอร์ชัน 2 ทำงานได้ดีสำหรับฉัน แต่ช้ามากเมื่อฉันใช้งานไฟล์ขนาดใหญ่ (& gt; = 0.5 GB) ดังนั้นฉันจึงสลับบรรทัด Out-File สำหรับ StreamWriter.WriteLine ()
Karl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.