Forum: D Programlama Dili RSS
gzip'li metin dosyasını satır satır okumak
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: gzip'li metin dosyasını satır satır okumak
Kadir Erdem'in sorduğu soruya şöyle bir çözüm olabilir:
import std.stdio;
import std.file;
import std.zlib;
import std.algorithm;
 
void main()
{
    auto içerik = read("foo.txt.gz");
    auto açıcı = new UnCompress();
    auto açılmış = cast(string)açıcı.uncompress(içerik);
 
    writefln("%-(%s\n%)", açılmış.splitter('\n'));
}
Ali
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İngilizce forumdan öğrendiğime göre yukarıdaki programın iki küçük sakıncası var:

1) std.algorithm.splitter'ı yalnızca '\n' ayracı ile kullanıyorum. std.string.splitLines ise daha genel çünkü başka satır ayraçlarını da tanıyor.

2) Sondaki düzen dizgisinde %| kullanılmadığı zaman en sonda fazladan bir boş satır beliriyor. (En azından benim denememde öyle oldu.)

O yüzden şu biraz daha iyi:
import std.stdio;
import std.file;
import std.zlib;
import std.string;
 
void main()
{
    auto packed = read("foo.txt.gz");
    auto up = new UnCompress();
    auto unpacked = cast(string)up.uncompress(packed);
 
    writefln("%-(%s%|\n%)", unpacked.splitLines);
}
Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında bu işin sonu yok da bir küçük katkı ben yapayım, n'olcak :p
import std.stdio;
import std.file;
import std.zlib;
import std.algorithm;
 
int main(string[] param)
{
    if(findSplit(param[1], ".txt.")[1].empty) {
        writefln("Dosya ismi (%s) uyumsuz! ", param[1]);
        writeln("Eğer uyumlu bir text dosyanız varsa, uzantı .txt.gz olmalı.");
        return 1;
    } /* Bir de bunun yukarısına param.lenght kontrolü lazım */
 
    auto packed = param[1].read();
    auto up = new UnCompress();
    auto unpacked = cast(string)up.uncompress(packed);
 
    writefln("%-(%s%|\n%)", unpacked.splitLines);
    /*
     * other codes… 
     */
    return 0;
}
Burada maksat, parametreli bir komut yapmak ve hazır environment arguments kullanmışken, uzantı kontrolü yaparak veri kaynağının gerçekten bir metin olduğunu çok aptal şekilde tespit etmek. Tabletden yazdığım için kodu deneyemedim ama hata varsa affola. En azından daha iyisi yapılabilir!
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2015-03-02, 22:39.
kerdemdemir #4
Üye Eyl 2013 tarihinden beri · 123 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhabalar,

İş yoğunluğundan dolay hiç bir şey yazamamış oldum kusuruma bakmayın. Uğraştığım küçük proje bitti ve bu sorunu aşağıdaki gibi çözmüşüm. Sizin tavsiyelerinize çok benziyor ama göndereyim dedim,

char[] unpacked;
File file = File(filename, "r");
auto packed = new ubyte[](cast(uint)file.size);
file.rawRead(packed);
 
unpacked ~= cast(char[])uc.uncompress(packed);
unpacked ~= cast(char[])uc.flush();
 
foreach (char[] line; unpacked.splitLines)
{
    ....

Saygılarımla
Kadir Erdem Demir
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 00:23:51 (UTC -08:00)