(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".
-
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! -
Używanie
split()
powoduje tworzenie wielu kopii danych i niepotrzebnie spowalnia aplikację. Zamiastsplit()
do parsowania stringów lepiej używaćsplitRef()
, które nie kopiuje danych tylko tworzy wektor QStringRef (odpowiednik standardowego string_view). -
Dobre info, Chris, dzięki!
W Qt 5.10 będzie już QStringView.