ทำรายการความยาวที่แน่นอนโดยใช้รายการอื่นหลายรายการ


0

ฉันมีไฟล์ขนาดเล็กจำนวนมากที่มีข้อความประมาณ 350,000 บรรทัด ตัวอย่างเช่น:

ไฟล์ 1:

 1. asdf
 2. wetwert
 3. ddghr
 4. vbnd
 ...
 264187. sdfre

ไฟล์ 2:

 1. erye
 2. yren
 3. asdf
 4. jkdt
 ...
 184168. uory

อย่างที่คุณเห็นบรรทัดที่ 3 ของไฟล์ 2 นั้นซ้ำกันของบรรทัดที่ 1 ในไฟล์ 1 ฉันต้องการปลั๊กอินของโปรแกรม / Notepad ++ ที่สามารถตรวจสอบและลบรายการที่ซ้ำกันเหล่านี้ในหลายไฟล์

ปัญหาต่อไปที่ฉันมีคือฉันต้องการรวมรายการทั้งหมดเป็นไฟล์บรรทัดขนาดใหญ่ 1.000.000 ตัวอย่างเช่นฉันมีไฟล์เหล่านี้:

  • 648563 บรรทัด
  • 375924 บรรทัด
  • 487036 บรรทัด

ฉันต้องการให้พวกเขาส่งผลให้ไฟล์เหล่านี้:

  • 1.000.000 บรรทัด
  • 511.523 บรรทัด

และไฟล์ 2 ไฟล์สุดท้ายจะต้องประกอบด้วยบรรทัดที่ไม่ซ้ำกันเท่านั้น ฉันจะทำสิ่งนี้ได้อย่างไร ฉันสามารถใช้บางโปรแกรมสำหรับสิ่งนี้ได้หรือไม่? หรือการรวมกันหลาย ๆ อย่างของ Notepad ++ ปลั๊กอิน? ฉันรู้ว่า GSplit สามารถแบ่งไฟล์ 1.536.243 ออกเป็นไฟล์ 1.000.000 และ 536.243 บรรทัด แต่นั่นไม่เพียงพอและไม่ลบรายการที่ซ้ำกันออก

ฉันต้องการสร้างปลั๊กอินหรือโปรแกรม Notepad ++ ของตัวเองหากจำเป็น แต่ฉันไม่รู้ว่าจะเริ่มจากตรงไหนและอย่างไร

ขอบคุณล่วงหน้า.


คุณสามารถใช้ Excel ในการทำเช่นนั้นเพียงแค่คัดลอกข้อความของไฟล์ข้อความทั้งหมดของคุณลงในคอลัมน์ excel จากนั้นใช้การลบที่ซ้ำกันใน Excel
Yacine

@Yacine ฉันคิดว่ามันเป็นไปไม่ได้ในทางปฏิบัติเพราะมีการเพิ่มไฟล์มากขึ้นเรื่อย ๆ เมื่อเวลาผ่านไปและตอนนี้ฉันมีประมาณ 10 ล้านบรรทัด และถ้าฉันทำอย่างนั้นฉันจะส่งออกทุกอย่างเป็นไฟล์ 1 ล้านบรรทัดได้อย่างไร
Werner Schoemaker

1
ดูเหมือนว่าเป็นเรื่องปกติสำหรับโปรแกรมอรรถประโยชน์บรรทัดคำสั่ง ใน Linux คุณควรใช้: cat "File "* | sort | uniq | split -d -l 1000000 - Combined.; สิ่งนี้จะสร้างCombined.00,, Combined.01... มียูทิลิตี้เหล่านี้เวอร์ชั่น Windows ทั้งหมดแม้ว่าสตริงการรันอาจแตกต่างกันเล็กน้อย
AFH

@AFH วิธีการแก้ปัญหาของคุณทำงานได้ดียกเว้นส่วน 'แยก' ฉันไม่สามารถหา Windows ที่เทียบเท่าได้ คุณมีความคิดว่าฉันจะแก้ปัญหานี้ได้อย่างไร? เนื่องจากการรวมการเรียงลำดับการลบรายการที่ซ้ำกันและการบันทึกไปยังไฟล์ใหม่ทำงานได้ดีมาก
Werner Schoemaker

ในสถานที่อื่น ๆ ก็จะมาพร้อมกับระบบสาธารณูปโภคในwin-ทุบตี
AFH

คำตอบ:


0

ฉันสร้างสคริปต์สำหรับ Windows Powershell และบันทึกเป็นไฟล์. ps1 ฉันสร้างมันดังต่อไปนี้:

$linecount = 0 
$editfilenumber = 1
$endfilenumber = 1
$totallines = 0
$i = 0
$interval = 100 / 1

ส่วนนี้เป็นเพียงการรีเซ็ตตัวแปรพื้นฐานทั้งหมด $linecountใช้สำหรับจำนวนบรรทัดที่สร้างในส่วนใหม่ (พูดถึงเรื่องนั้นในภายหลัง) $editfilenumberใช้สำหรับหมายเลขไฟล์ที่กำลังถูกแก้ไข (ลบออกซ้ำ, ไม่ถูกลบ invalids ... ) $endfilenumberใช้สำหรับหมายเลขชิ้นส่วนที่สร้างขึ้น $totallinesใช้สำหรับจำนวนบรรทัดทั้งหมด $iใช้สำหรับคำนวณเปอร์เซ็นต์ $intervalใช้สำหรับช่วงเวลารีเฟรชของแถบความคืบหน้า (มิฉะนั้นกระบวนการจะช้ามาก)

$srcdirectory = Read-host "Select path to the source folder"
$partdirectory = Read-host "Select path to where the parts need to be stored"
$maxlines = Read-host "How many lines are in the new parts?"
$maxsize = [int]$maxlines
$partname = Read-host "How do you want the new parts to be called?"

โดยทั่วไปจะถามผู้ใช้สำหรับข้อมูลและจำนวนบรรทัดในส่วนต่างๆ

$files = Get-ChildItem $srcdirectory -filter *.txt
Write-Host "These files will be edited and combined: "
$files | format-table name

นี่จะแสดงรายการไฟล์. txt ทั้งหมดในไดเรกทอรีที่กำหนด สิ่งนี้ทำเพื่อให้ผู้ใช้ทราบว่าจะใช้ไฟล์ใด

Write-Host "Press any key to continue..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()

สิ่งนี้จะรอการยืนยันจากผู้ใช้โดยรอให้กดปุ่ม

$start = Get-Date

นี่จะได้รับการประทับเวลาปัจจุบันเพื่อคำนวณเวลาการประมวลผลในที่สุด

ForEach ($file in $files) { 

    Write-host "Editing file: " $file
    Write-host "Loading list..."
    $list = Get-content $srcdirectory\$file
    Write-host "OK" -foregroundcolor "green"

    Write-host "Removing duplicates..."
    $list = $list | Get-Unique
    Write-host "OK" -foregroundcolor "green"

    Write-host "Removing invalid..."
    $list = $list | Where { $_ -notmatch "^@" } | Where { $_ -match "@" }
    $list = $list -replace ';', ':' | Where {$_ -notmatch ':[^\)]+:'} | Where {$_ -notmatch '::'}
    Write-host "OK" -foregroundcolor "green"

    Write-host "Combining lists..."
    $longlist = $longlist + $list | Get-Unique
    $editfilenumber ++
    Write-host "Success!" -foregroundcolor "green"
}

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

Write-Host "Removing all duplicates..."
$longlist = $longlist | Get-Unique
Write-Host "Success!" -foregroundcolor "green"

$longlistนี้จะเอารายการที่ซ้ำกันทั้งหมดจาก

Write-host "Calculating total number of lines..."
$longlist | % { $totallines += $_.count }
Write-host "There are a total of " $totallines " unique and valid lines." -
foregroundcolor "green"

สิ่งนี้จะคำนวณจำนวนบรรทัดที่ใช้ได้ทั้งหมด นี่คือข้อมูลของผู้ใช้และใช้ในการคำนวณความคืบหน้าในแถบความคืบหน้า

Write-host "Creating parts..."
$longlist | ForEach { 
    Add-Content $partdirectory/$partname.$endfilenumber.txt "$_"  
    $linecount++
    $i++
    If ($linecount -eq $maxsize) { 
        Write-host "Success! " $partname$endfilenumber " created" -foregroundcolor "green"
        $endfilenumber++ 
        $linecount = 0 
    } 
    If ($i % $interval -eq 0) {
        $percent = ($i / $totallines) * 100
        $percent = [math]::Round($percent,2)
        Write-Progress -Activity "Creating parts" -Status $percent -PercentComplete $percent
    }
} 

นี่คือส่วนที่สำคัญที่สุด มันสร้างไฟล์ที่มีชื่อไฟล์ที่ระบุในไดเรกทอรีที่ระบุ มันเพิ่ม 1 รายการ $ longlist ในไฟล์นั้น จากนั้นมันจะเพิ่มขึ้น$linecountและ$i1 หาก$linecountเท่ากับขนาดไฟล์สูงสุดที่ระบุไว้ก็จะเพิ่มขึ้น$endfilecount1 หากไม่มีบรรทัดถัดไปจะถูกเพิ่มเข้าไปในไฟล์ที่มีอยู่

ยกตัวอย่างเช่นขนาดไฟล์ที่ระบุ 10.000 Part$endfilenumberเส้นและชื่อส่วนหนึ่งคือ บรรทัดแรกของ$longlistถูกเพิ่มลงในไฟล์ Part1.txt ( $endfilenumber = 1ตามที่ระบุในบรรทัดแรกของโค้ด) เมื่อเพิ่มบรรทัดที่ 10.00 Ifคำสั่งจะถูกใช้ ซึ่งหมายความว่า$endfilenumberจะเพิ่มขึ้น 1 วิธีนี้$longlistจะเพิ่มบรรทัดถัดไปจากลงในไฟล์ใหม่ชื่อ Part2.txt (เพราะ$endfilenumber = 2)

ที่สองถ้าคำสั่งจะใช้สำหรับการคำนวณความคืบหน้า สิ่งนี้ไม่สำคัญดังนั้นเพื่อประหยัดเวลาฉันจะไม่อธิบายสิ่งนั้น

$end = Get-Date
$time = ($end-$start).TotalMinutes
$time = [math]::Round($time,2)

Write-host "A total of " $endfilenumber " parts have been created" -
foregroundcolor "green"
Write-host "Total processing time: " $time " minutes" -foregroundcolor "green"


Write-Host "Press any key to exit..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()

นี่คือส่วนสุดท้ายของรหัส การดำเนินการนี้ใช้เวลาประทับและลบออกจากการประทับเวลาในตอนเริ่มต้น วิธีนี้คำนวณเวลาประมวลผลเป็นนาทีและปัดเศษเป็นทศนิยม 2 ตำแหน่ง บิตสุดท้ายที่รอการยืนยันจากผู้ใช้เพื่อสิ้นสุดและปิดโปรแกรม

ฉันหวังว่านี่จะช่วยได้เล็กน้อย

หมายเหตุ: โปรแกรมนี้ไม่มีผลกับไฟล์ต้นฉบับ! ดีจังฉันเดาว่า ...


ในการฝึกฝนคำตอบของคุณไม่เพียง แต่ช่วยคุณ - เป็นคนต่อไปที่มีปัญหาเดียวกัน - ดังนั้นการโพสต์สคริปต์ powershell ของคุณจะได้รับการชื่นชมเพื่อหลีกเลี่ยงผลdenvercoder / xkcd 979
Journeyman Geek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.