Giriş

İşletmenizin büyük miktarlarda fatura, yasal belge veya sıkıştırılmış ZIP veya RAR dosyaları olarak gelen e‑posta ihracı gibi dosyaları alması gerektiğinde, geleneksel yaklaşım bu dosyaları diske açmak, her bir dosyayı ayrı bir okuyucu ile açmak ve ardından geçici dosyaları silmektir. Bu döngü maliyetli I/O ekler, temizlik işlemlerini karmaşık hâle getirir ve iç içe arşivlerle çalışmayı bir kabusa dönüştürür.

GroupDocs.Parser for .NET bu sorunları ortadan kaldırır. Arşivi doğrudan açmanıza, her bir girdiyi sıralamanıza ve ham metni (ve meta verileri) tamamen bellekte çıkarmanıza olanak tanır. Bu makalede şunları öğreneceksiniz:

  • Parser NuGet paketini kurma.
  • Düz bir arşivden tek seferde metin çekme.
  • İç içe ZIP/RAR dosyalarını yinelemeli (rekürsif) yürütme.
  • Dayanıklı işleme için en iyi uygulama ayarlarını uygulama.

Bellek İçi Arşiv Ayrıştırmasının Önemi

Arşivleri bellek içinde işlemek size şunları sağlar:

  • Sıfır geçici dosya – disk karmaşası yok, kalan dosya yok.
  • Hız – her bir girdi için ek okuma/ yazma döngüsünden kaçının.
  • Ölçeklenebilirlik – dosya sisteminin bulunmadığı büyük arşivler veya bulut akışlarıyla çalışın.

Önkoşullar

  • .NET 6.0 ve üzeri.
  • GroupDocs.Parser for .NET (en son sürüm) – ücretsiz deneme için geçici lisansa bakın.
  • Desteklenen belgeleri (PDF, DOCX, TXT, vb.) içeren bir ZIP veya RAR arşivi.

Kurulum

dotnet add package GroupDocs.Parser

Gerekli ad alanlarını ekleyin:

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

Adım 1 – Arşivi Açma

İlk adım, arşiv dosyasına işaret eden bir Parser örneği oluşturmaktır. GetContainer() arşiv içindeki her bir giriş için bir ContainerItem nesnesi koleksiyonu döndürür.

// Tarama yapmak istediğiniz arşivin yolu
string archivePath = "./SampleDocs/InvoicesArchive.zip";

using (Parser parser = new Parser(archivePath))
{
    // Kapsayıcı içindeki her dosyayı (veya iç içe arşivi) alın
    IEnumerable<ContainerItem> attachments = parser.GetContainer();

    if (attachments == null)
    {
        Console.WriteLine("Arşiv boş veya okunamıyor.");
        return;
    }

    // Metin/meta veriyi çıkaran yardımcı metoda koleksiyonu aktarın
    ExtractDataFromAttachments(attachments);
}

Ne oluyor:

  • Parser yapıcısı arşivi diske çıkarmadan yükler.
  • GetContainer() arşivin dizinini tembel (lazy) bir şekilde okur ve üzerinde çalışabileceğiniz ContainerItem nesnelerini verir.

Adım 2 – Her Girdiyi İşleme

ExtractDataFromAttachments, ContainerItem listesini dolaşır, temel meta verileri yazdırır, iç içe arşivleri algılar ve normal belgelerden metin çıkarır. Metod tamamen yeniden kullanılabilir – bir üst‑düzey arşiv için bir kez ve keşfettiğiniz her iç içe arşiv için tekrar çağırın.

/// <summary>
/// Bir arşivdeki her öğeden meta verileri ve düz metni yinelemeli olarak çıkarır.
/// </summary>
static void ExtractDataFromAttachments(IEnumerable<ContainerItem> attachments)
{
    foreach (ContainerItem item in attachments)
    {
        // Dosya adı ve boyutu ile kısa bir satır yazdır (isteğe bağlı)
        Console.WriteLine($"Dosya: {item.FilePath} | Boyut: {item.Metadata.Size} bayt");

        try
        {
            // Her ContainerItem kendi Parser örneğini açabilir
            using (Parser itemParser = item.OpenParser())
            {
                if (itemParser == null)
                {
                    // Öğenin desteklenen bir belge olmadığını atla
                    continue;
                }

                // Uzantıya (büyük‑küçük harf duyarsız) bakarak iç içe arşivleri algıla
                bool isArchive = item.FilePath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase) ||
                                 item.FilePath.EndsWith(".rar", StringComparison.OrdinalIgnoreCase);

                if (isArchive)
                {
                    // İç arşivi yinelemeli olarak işle
                    IEnumerable<ContainerItem>? nested = itemParser.GetContainer();
                    if (nested != null)
                    {
                        ExtractDataFromAttachments(nested);
                    }
                }
                else
                {
                    // Normal belge – ham metnini çıkar
                    using (TextReader reader = itemParser.GetText())
                    {
                        string text = reader.ReadToEnd();
                        Console.WriteLine($"'{item.FilePath}' dosyasından {text.Length} karakter çıkarıldı");
                        // Burada `text`i bir veritabanına kaydedebilir, indeksleyebilir vb. yapabilirsiniz
                    }
                }
            }
        }
        catch (UnsupportedDocumentFormatException)
        {
            // Dosya tipi GroupDocs.Parser tarafından desteklenmiyor – hatayı sessizce yoksayın
            Console.WriteLine($"Desteklenmeyen format atlanıyor: {item.FilePath}");
        }
    }
}

Önemli Noktalar

  • Meta veri erişimiitem.Metadata dosya adı, boyut, oluşturma tarihi vb. bilgileri dosya içeriğini okumadan verir.
  • Yinelemeli işleme – Başka bir ZIP/RAR bulunduğunda aynı metot kendini çağırır, sınırsız iç içe desteği sağlar.
  • Hata dayanıklılığıUnsupportedDocumentFormatException yakalanır, böylece tek bir hatalı dosya tüm çalışmayı durdurmaz.

Adım 3 – Hepsini Bir Araya Getirme

Aşağıda, yukarıdaki iki kod parçacığını birleştiren, kopyala‑yapıştır yapılabilir minimal bir program bulunmaktadır. Kurulum, açma, işleme ve raporlama adımlarını tam bir uç‑uç akışta gösterir.

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("Arşivde öğe bulunamadı.");
                return;
            }
            ExtractDataFromAttachments(attachments);
        }
    }

    static void ExtractDataFromAttachments(IEnumerable<ContainerItem> attachments)
    {
        foreach (ContainerItem item in attachments)
        {
            Console.WriteLine($"Dosya: {item.FilePath} | Boyut: {item.Metadata.Size} bayt");
            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($"'{item.FilePath}' dosyasından {text.Length} karakter çıkarıldı");
                        }
                    }
                }
            }
            catch (UnsupportedDocumentFormatException)
            {
                Console.WriteLine($"Desteklenmeyen format: {item.FilePath}");
            }
        }
    }
}

Programı, arşivinizin yolunu belirterek çalıştırın:

dotnet run -- ./Data/LegalDocs.zip

En İyi Uygulamalar ve İpuçları

  • Ayrıştırma seçeneklerini sınırlayın – Varsayılan olarak Parser tüm desteklenen içeriği çıkarır. Sadece metne ihtiyacınız varsa GetImages() gibi ağır yöntemleri çağırmaktan kaçının.
  • Büyük arşivler – Gösterildiği gibi öğeleri sırayla işleyin; tüm metinleri bir kerede belleğe yüklemeyin.
  • Performans – Geriye dönük (recursive) işlem yapmadan önce dosya uzantısını kontrol ederek ihtiyacınız olmayan iç içe arşivleri atlayın.
  • Hata yönetimi – Her zaman UnsupportedDocumentFormatException yakalayın; kurumsal arşivlerde parserın okuyamadığı ikili dosyalar bulunabilir.

Sonuç

GroupDocs.Parser for .NET, ZIP veya RAR arşivlerinin içinde ne kadar derinlemesine iç içe olursa olsun, her belgeyi bellek içinde temiz bir şekilde okumanızı sağlar. Sadece birkaç satır kodla karmaşık unzip‑plus‑parse boru hatlarını değiştirebilir, I/O yükünü azaltabilir ve güvenilir belge yutma hizmetleri oluşturabilirsiniz.

Bir sonraki adımlar

  • belge karşılaştırma veya meta veri çıkarma özelliklerini keşfedin.
  • Aynı API ile arşivlenmiş dosyalardan görüntüleri nasıl çıkaracağınızı öğrenin.
  • Çıkarılan metni bir arama indeksine ya da AI boru hattına entegre edin.

Ek Kaynaklar