(specyficzny?) odczyt danych z pliku txt



  • Witam
    Napisałem program który tworzy pliki tekstowe w których dane są zapisywane w następujący sposób:
    info1;info2;info3;...

    Potrzebuję jednak, by program był również w stanie przy odczycie danych rozdzielić poszczególne informacje.
    Miałem pomysł żeby odczytywać dane znak po znaku, a przy wykryciu separatora po prostu przeskoczyć do kolejnego ciągu string. Jednak jedno że byłoby to rozwiązanie wg mnie nieefektywne, to na dodatek nie mam pojęcia jak oprogramować przesuwanie wskaźnika odczytu po odczytaniu znaku.
    Wszelkie sugestie są mile widziane :)



  • Hej,

    Jeżeli odczytasz dane w postaci QByteArray. to możesz użyć metod QByteArray::split() Dokumentacja. Dane możesz "posplitować" po znaku: ";" W wyniku otrzymasz listę z każdym "info".


  • Moderators

    To są pliki CSV, są do tego biblioteki :-) Ale można też ręcznie, bardzo prosto:

    QFile file("something.csv");
    
    if (file.open(QFile::Text | QFile::ReadOnly) {
      const QString data(file.readAll());
      const QStringList pieces(data.split(";")); // Dzielimy dane na kawałki
    
      for (auto piece : pieces) {
        // do something with each data piece
      }
    }
    

    Tylko uwaga - jeśli wiesz, ze plik może być duży, lepiej nie używać readAll() - całość zostanie zaczytana do RAMu, moze to trwać no i obciążyć pamięć/ procesor niepotrzebnie. W takim wypadku lepiej postawić na streaming operators (QTextStream, zobacz użycie w dokumentacji QFile i QTextStream), wtedy plik jest czytany kawałek po kawałku.



  • Stokrotne dzięki!!!!
    Właśnie tego szukałem
    Piszę program na zaliczenie semestru więc na chwilę obecną musi mi wystarczyć zapis do notatnika. Bazy danych będę miał dopiero w przyszłym semestrze, więc upgrade programu trochę zaczeka.
    Jeszcze raz wielkie dzięki!


  • Moderators

    Używanie split() powoduje tworzenie wielu kopii danych i niepotrzebnie spowalnia aplikację. Zamiast split() do parsowania stringów lepiej używać splitRef(), które nie kopiuje danych tylko tworzy wektor QStringRef (odpowiednik standardowego string_view).


  • Moderators

    Dobre info, Chris, dzięki!

    W Qt 5.10 będzie już QStringView.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.