บทนำ

เมื่อธุรกิจของคุณต้องรับข้อมูลจำนวนมากของใบแจ้งหนี้ เอกสารทางกฎหมาย หรือการส่งออกอีเมลที่มาถึงในรูปแบบไฟล์บีบอัด ZIP หรือ RAR วิธีการแบบดั้งเดิมคือการแตกไฟล์ออกไปยังดิสก์ เปิดแต่ละไฟล์ด้วยตัวอ่านแยกต่างหาก แล้วลบไฟล์ชั่วคราวออก การทำเช่นนี้เพิ่มการทำ I/O ที่มีค่าใช้จ่ายสูง ทำให้การทำความสะอาดซับซ้อน และทำให้การจัดการไฟล์เก็บข้อมูลที่ซ้อนกันเป็นเรื่องน่ากลัว

GroupDocs.Parser for .NET ขจัดจุดเจ็บปวดเหล่านี้ มันให้คุณ เปิดไฟล์เก็บข้อมูลโดยตรง, แสดงรายการทุกรายการ, และ ดึงข้อความดิบ (และเมตาดาต้า) อย่างสมบูรณ์ในหน่วยความจำ ในบทความนี้คุณจะได้เรียนรู้วิธี:

  • ติดตั้งแพคเกจ NuGet ของ Parser
  • ดึงข้อความจากไฟล์เก็บข้อมูลแบบแบนในหนึ่งรอบ
  • เดินทางแบบเรียกซ้ำผ่านไฟล์ ZIP/RAR ที่ซ้อนกัน
  • ใช้การตั้งค่าที่เป็นแนวปฏิบัติที่ดีที่สุดสำหรับการประมวลผลที่มั่นคง

ทำไมการแยกวิเคราะห์ไฟล์เก็บข้อมูลในหน่วยความจำจึงสำคัญ

การประมวลผลไฟล์เก็บข้อมูลในหน่วยความจำให้คุณ:

  • ไม่มีไฟล์ชั่วคราว – ไม่ทำให้ดิสก์รก ไม่เหลือไฟล์ที่ค้างอยู่
  • ความเร็ว – หลีกเลี่ยงการอ่าน/เขียนเพิ่มเติมสำหรับแต่ละรายการ
  • ความสามารถขยาย – จัดการไฟล์เก็บข้อมูลขนาดใหญ่หรือสตรีมบนคลาวด์ที่อาจไม่มีระบบไฟล์

ข้อกำหนดเบื้องต้น

  • .NET 6.0 หรือใหม่กว่า
  • GroupDocs.Parser for .NET (เวอร์ชันล่าสุด) – ดูที่ temporary license สำหรับการประเมินฟรี
  • ไฟล์ ZIP หรือ RAR ที่มีเอกสารที่รองรับ (PDF, DOCX, TXT ฯลฯ)

การติดตั้ง

dotnet add package GroupDocs.Parser

เพิ่มเนมสเปซที่จำเป็น:

using GroupDocs.Parser;
using GroupDocs.Parser.Data;
using System.Collections.Generic;
using System.IO;

ขั้นตอน 1 – เปิดไฟล์เก็บข้อมูล

ขั้นตอนแรกคือการสร้างอินสแตนซ์ Parser ที่ชี้ไปยังไฟล์เก็บข้อมูล GetContainer() จะคืนคอลเลกชันของอ็อบเจกต์ ContainerItem – หนึ่งรายการต่อแต่ละไฟล์ภายในไฟล์เก็บข้อมูล

// Path to the archive you want to scan
string archivePath = "./SampleDocs/InvoicesArchive.zip";

using (Parser parser = new Parser(archivePath))
{
    // Retrieve every file (or nested archive) inside the container
    IEnumerable<ContainerItem> attachments = parser.GetContainer();

    if (attachments == null)
    {
        Console.WriteLine("Archive is empty or could not be read.");
        return;
    }

    // Hand off the collection to a helper that extracts text/metadata
    ExtractDataFromAttachments(attachments);
}

สิ่งที่เกิดขึ้น:

  • ตัวสร้าง Parser โหลดไฟล์เก็บข้อมูล โดยไม่ต้องแตกไฟล์ออกไปยังดิสก์
  • GetContainer() อ่านไดเรกทอรีของไฟล์เก็บข้อมูลแบบ lazy และให้คุณทำงานกับอ็อบเจกต์ ContainerItem

ขั้นตอน 2 – ประมวลผลแต่ละรายการ

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

/// <summary>
/// Recursively extracts metadata and plain‑text from each item in an archive.
/// </summary>
static void ExtractDataFromAttachments(IEnumerable<ContainerItem> attachments)
{
    foreach (ContainerItem item in attachments)
    {
        // Print a quick line with file name and size (optional)
        Console.WriteLine($"File: {item.FilePath} | Size: {item.Metadata.Size} bytes");

        try
        {
            // Each ContainerItem can open its own Parser instance
            using (Parser itemParser = item.OpenParser())
            {
                if (itemParser == null)
                {
                    // The item is not a supported document – skip it
                    continue;
                }

                // Detect nested archives by extension (case‑insensitive)
                bool isArchive = item.FilePath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) ||
                                 item.FilePath.EndsWith(".rar", StringComparison.OrdinalIgnoreCase);

                if (isArchive)
                {
                    // Recursively process the inner archive
                    IEnumerable<ContainerItem>? nested = itemParser.GetContainer();
                    if (nested != null)
                    {
                        ExtractDataFromAttachments(nested);
                    }
                }
                else
                {
                    // Regular document – extract its raw text
                    using (TextReader reader = itemParser.GetText())
                    {
                        string text = reader.ReadToEnd();
                        Console.WriteLine($"Extracted {text.Length} characters from {item.FilePath}");
                        // Here you could store `text` in a database, index it, etc.
                    }
                }
            }
        }
        catch (UnsupportedDocumentFormatException)
        {
            // The file type is not supported by GroupDocs.Parser – ignore gracefully
            Console.WriteLine($"Skipping unsupported format: {item.FilePath}");
        }
    }
}

จุดสำคัญ

  • การเข้าถึงเมตาดาต้าitem.Metadata ให้ชื่อไฟล์ ขนาด วันที่สร้าง ฯลฯ โดยไม่ต้องอ่านเนื้อหาไฟล์
  • การจัดการแบบเรียกซ้ำ – วิธีเดียวกันจะเรียกตัวเองเมื่อพบ ZIP/RAR อีกชั้นหนึ่ง ทำให้รองรับการซ้อนกันได้ไม่จำกัด
  • ความทนทานต่อข้อผิดพลาด – ดัก UnsupportedDocumentFormatException เพื่อให้ไฟล์ที่ไม่รองรับเพียงไฟล์เดียวไม่ทำให้การทำงานทั้งหมดหยุด

ขั้นตอน 3 – รวมทุกอย่างเข้าด้วยกัน

ด้านล่างเป็นโปรแกรมขนาดเล็กที่สามารถคัดลอกและวางได้ซึ่งรวมโค้ดสองส่วนข้างต้นเข้าด้วยกัน มันแสดงกระบวนการเต็มรูปแบบจากการติดตั้ง การเปิด การประมวลผล ไปจนถึงการรายงานผล

using GroupDocs.Parser;
using GroupDocs.Parser.Data;
using System;
using System.Collections.Generic;
using System.IO;

class ArchiveTextExtractor
{
    static void Main(string[] args)
    {
        string archivePath = args.Length > 0 ? args[0] : "./SampleDocs/InvoicesArchive.zip";
        using (Parser parser = new Parser(archivePath))
        {
            IEnumerable<ContainerItem> attachments = parser.GetContainer();
            if (attachments == null)
            {
                Console.WriteLine("No items found in the archive.");
                return;
            }
            ExtractDataFromAttachments(attachments);
        }
    }

    static void ExtractDataFromAttachments(IEnumerable<ContainerItem> attachments)
    {
        foreach (ContainerItem item in attachments)
        {
            Console.WriteLine($"File: {item.FilePath} | Size: {item.Metadata.Size} bytes");
            try
            {
                using (Parser itemParser = item.OpenParser())
                {
                    if (itemParser == null) continue;

                    bool isArchive = item.FilePath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) ||
                                     item.FilePath.EndsWith(".rar", StringComparison.OrdinalIgnoreCase);

                    if (isArchive)
                    {
                        var nested = itemParser.GetContainer();
                        if (nested != null) ExtractDataFromAttachments(nested);
                    }
                    else
                    {
                        using (TextReader reader = itemParser.GetText())
                        {
                            string text = reader.ReadToEnd();
                            Console.WriteLine($"Extracted {text.Length} chars from {item.FilePath}");
                        }
                    }
                }
            }
            catch (UnsupportedDocumentFormatException)
            {
                Console.WriteLine($"Unsupported format: {item.FilePath}");
            }
        }
    }
}

เรียกโปรแกรมพร้อมพาธไปยังไฟล์เก็บข้อมูลของคุณ:

dotnet run -- ./Data/LegalDocs.zip

แนวทางปฏิบัติที่ดีที่สุดและเคล็ดลับ

  • จำกัดตัวเลือกการแยกวิเคราะห์ – โดยค่าเริ่มต้น Parser จะดึงเนื้อหาที่รองรับทั้งหมด หากคุณต้องการแค่ข้อความ ให้หลีกเลี่ยงการเรียกเมธอดหนักอย่าง GetImages()
  • ไฟล์เก็บข้อมูลขนาดใหญ่ – ประมวลผลรายการต่อรายการตามที่แสดง อย่าโหลดข้อความทั้งหมดเข้าหน่วยความจำพร้อมกัน
  • ประสิทธิภาพ – ข้ามไฟล์เก็บข้อมูลที่คุณไม่ต้องการโดยตรวจสอบนามสกุลไฟล์ก่อนทำการเรียกซ้ำ
  • การจัดการข้อผิดพลาด – ควรดัก UnsupportedDocumentFormatException เสมอ; ไฟล์ไบนารีหลายไฟล์ในองค์กรอาจไม่สามารถอ่านได้โดย parser

สรุป

GroupDocs.Parser for .NET ให้วิธีที่สะอาดและทำงานในหน่วยความจำเพื่ออ่านทุกเอกสารภายในไฟล์ ZIP หรือ RAR ไม่ว่าจะซ้อนกันลึกแค่ไหน ด้วยเพียงไม่กี่บรรทัดของโค้ดคุณก็สามารถแทนที่กระบวนการ unzip‑plus‑parse ที่ซับซ้อน ลดภาระ I/O และสร้างบริการรับข้อมูลเอกสารที่เชื่อถือได้

ขั้นตอนต่อไป

  • สำรวจคุณลักษณะ document comparison หรือ metadata extraction
  • เรียนรู้วิธีดึงรูปภาพจากไฟล์ที่บีบอัดด้วย API เดียวกัน
  • ผสานข้อความที่ดึงมาเข้ากับดัชนีการค้นหาหรือสายงาน AI

แหล่งข้อมูลเพิ่มเติม