Introduction
เมื่อธุรกิจของคุณต้องรับข้อมูลหลายชุดของใบแจ้งหนี้ เอกสารทางกฎหมาย หรืออีเมลที่ส่งออกมาในรูปแบบไฟล์บีบอัด ZIP หรือ RAR วิธีเดิมคือการแตกไฟล์เหล่านั้นลงดิสก์ เปิดแต่ละไฟล์ด้วยรีดเดอร์แยกกัน แล้วลบไฟล์ชั่วคราวออก การทำเช่นนี้ทำให้ต้องทำ I/O เพิ่มเติม ค่าใช้จ่ายสูง ทำความสะอาดระบบซับซ้อน และการจัดการไฟล์บีบอัดที่ซ้อนกันหลายระดับกลายเป็นความยุ่งลำบาก
GroupDocs.Parser for .NET ขจัดปัญหาเหล่านี้ มันให้คุณ เปิดไฟล์บีบอัดโดยตรง, สำรวจรายการรายการภายในทั้งหมด, และ สกัดข้อความดิบ (พร้อมเมตาดาต้า) อย่างเต็มที่ในหน่วยความจำ ในบทความนี้คุณจะได้เรียนรู้วิธี:
- ติดตั้งแพ็กเกจ NuGet ของ Parser
- ดึงข้อความจากไฟล์บีบอัดแบบแบนในหนึ่งรอบ
- เดินสำรวจไฟล์ ZIP/RAR ที่ซ้อนกันอย่างเรียกซ้ำ
- ปรับใช้การตั้งค่าตามแนวปฏิบัติที่ดีที่สุดสำหรับการประมวลผลที่เสถียร
Why In‑Memory Archive Parsing Matters
การประมวลผลไฟล์บีบอัดในหน่วยความจำให้คุณได้:
- ไม่มีไฟล์ชั่วคราว – ไม่มีไฟล์ค้างบนดิสก์
- ความเร็ว – ไม่ต้องทำรอบการอ่าน/เขียนเพิ่มเติมสำหรับแต่ละรายการ
- ความสามารถขยายตัว – รองรับไฟล์บีบอัดขนาดใหญ่หรือสตรีมบนคลาวด์ที่ระบบไฟล์อาจไม่มีให้ใช้
Prerequisites
- .NET 6.0 หรือใหม่กว่า
- GroupDocs.Parser for .NET (เวอร์ชันล่าสุด) – ดูที่ temporary license สำหรับการประเมินฟรี
- ไฟล์ ZIP หรือ RAR ที่บรรจุเอกสารที่รองรับ (PDF, DOCX, TXT ฯลฯ)
Installation
dotnet add package GroupDocs.Parser
เพิ่ม namespace ที่จำเป็น:
using GroupDocs.Parser;
using GroupDocs.Parser.Data;
using System.Collections.Generic;
using System.IO;
Step 1 – Open the Archive
ขั้นตอนแรกคือการสร้างอ็อบเจกต์ 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()อ่านดัชนีของบีบอัดแบบขี้เกียจและให้คุณได้อ็อบเจกต์ContainerItemสำหรับทำงานต่อไป
Step 2 – Process Each Entry
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}");
}
}
}
Key Points
- การเข้าถึงเมตาดาต้า –
item.Metadataให้คุณได้ชื่อไฟล์, ขนาด, วันที่สร้าง ฯลฯ โดยไม่ต้องอ่านเนื้อหาไฟล์ - การจัดการแบบเรียกซ้ำ – วิธีเดียวกันจะเรียกตัวเองเมื่อตรวจพบ ZIP/RAR อีกอัน ทำให้รองรับการซ้อนกันได้ไม่จำกัด
- ความทนทานต่อข้อผิดพลาด – ดัก
UnsupportedDocumentFormatExceptionเพื่อให้ไฟล์ที่ไม่รองรับหนึ่งไฟล์ไม่ทำให้การทำงานทั้งหมดล้มเหลว
Step 3 – Putting It All Together
ด้านล่างเป็นโปรแกรมขนาดเล็กแบบคัดลอก‑วาง ที่รวมโค้ดสองส่วนข้างบนเข้าด้วยกัน แสดงกระบวนการจากต้นจนจบ: ติดตั้ง, เปิด, ประมวลผล, และรายงานผล
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
Best Practices & Tips
- จำกัดตัวเลือกการแปลง – ค่าเริ่มต้น Parser จะสกัดเนื้อหาที่รองรับทั้งหมด หากคุณต้องการเพียงข้อความเท่านั้น ให้หลีกเลี่ยงการเรียกเมธอดที่หนักเช่น
GetImages() - ไฟล์บีบอัดขนาดใหญ่ – ประมวลผลรายการต่อรายการตามที่แสดง อย่าโหลดข้อความทั้งหมดเข้าหน่วยความจำพร้อมกัน
- ประสิทธิภาพ – ข้ามไฟล์บีบอัดที่ไม่ต้องการโดยตรวจสอบนามสกุลไฟล์ก่อนทำการเรียกซ้ำ
- การจัดการข้อผิดพลาด – ควรดัก
UnsupportedDocumentFormatExceptionเสมอ; ไฟล์อเนกประสงค์ในองค์กรหลายแห่งมักมีไบนารีที่ตัว parser ไม่อ่านได้
Conclusion
GroupDocs.Parser for .NET ให้วิธีอ่านทุกเอกสารภายในไฟล์ ZIP หรือ RAR อย่างเต็มที่ในหน่วยความจำ ไม่ว่าจะซ้อนกันลึกแค่ไหน ด้วยเพียงไม่กี่บรรทัดของโค้ด คุณก็สามารถแทนที่กระบวนการ “แตกไฟล์‑แล้ว‑แปลง” ที่ซับซ้อน ลดภาระ I/O ลง และสร้างบริการรับเอกสารที่เชื่อถือได้
Next steps
- สำรวจคุณสมบัติ document comparison หรือ metadata extraction
- เรียนรู้วิธีสกัดรูปภาพจากไฟล์บีบอัดด้วย API เดียวกัน
- นำข้อความที่สกัดได้ไปใส่ในดัชนีการค้นหาหรือกระบวนการ AI