CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Szybki parser CSV

Szybki parser CSV

dział ogólny

Re: Szybki parser CSV

Nowy postprzez Corvis » piątek, 17 września 2010, 08:37

Dzięki za pomoc. Nie było mnie pare dni - byłem na premierze RAD STUDIO XE. Dziś max jutro postaram się to sprawdzić. W nowym builderze XE jest możliwość profilowania kodu. Tak więć przepuszcze te 2 kody przez maszynke do profilowania i wkleje wyniki, zobaczymy co działa lepiej hehehe.


Pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaSafari

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 12:11

polymorphism

bawię się twoim kodem (tym ostatnim) i mam problem w lini:

Kod: Zaznacz cały
ng.get(p3,p1,file,err,v);


błąd:

[BCC32 Error] FMain.cpp(118): E2285 Could not find a match for 'num_get<char,char *>::get(char *,char *,int,_Iosb<int>::_Iostate,int)'

U ciebie się to kompiluje bez problemu ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 12:24

Żadnych problemów. Zresztą jak mógłbym zrobić pomiary dla tego kodu bez jego kompilacji?

Pytanie, dlaczego kompilator w trzecim parametrze widzi int a nie ios_base, ergo, dlaczego file nie jest strumieniem?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 12:25

KOD cpp:     UKRYJ  
 std::ifstream file;
          file.open(NazwaPliku.c_str());
          std::vector<double> dane;
          dane.clear();
          if(file.is_open()) {
                typedef num_get<char,char*> num_get_type;
                char cell_text[100];
                char* p2 = cell_text + sizeof(cell_text);
                const num_get_type &ng = std::use_facet<num_get_type >(file.getloc());
                char c = 0;
                int v = 0;
                while(c != EOF) {
                        c = 0;
                        while(c != '\n') {
                                char* p1 = cell_text;

                                while(p1 < p2 &&
                                                (*p1 = file.rdbuf()->sbumpc()) != EOF &&
                                                *p1 != ',' &&
                                                *p1 != '\n') ++p1;

                                if(p1 == p2) throw std::overflow_error("cell is too big!");
                                c = *p1;
                                if(p1 == cell_text)break;

                                char *p3 = cell_text;
                                while(p3 != p1 && isspace(*p3))++p3;

                                ios_base::iostate err = 0;
                                ng.get(p3,p1,file,err,v);

                                if(err & (ios::failbit | ios::badbit)) {
                                        throw invalid_argument("");
                                }
                                dane.push_back(v);
                        }
                }
                file.close();
          } else ShowMessage("Nie można otworzyć pliku");


Tak wygląda mój kod
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 12:32

Hmm, nie widzę żadnych błędów... no może poza niekonsekwentnym dodawaniem std::. Być może tu tkwi problem, więc popraw to.

Zakładam, że załączyłeś plik <locale>.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 12:36

KOD cpp:     UKRYJ  
   std::ifstream file;
          file.open(NazwaPliku.c_str());
          std::vector<double> dane;
          dane.clear();
          if(file.is_open()) {
                typedef std::num_get<char,char*> num_get_type;
                char cell_text[100];
                char* p2 = cell_text + sizeof(cell_text);
                const num_get_type &ng = std::use_facet<num_get_type >(file.getloc());
                char c = 0;
                int v = 0;
                while(c != EOF) {
                        c = 0;
                        while(c != '\n') {
                                char* p1 = cell_text;

                                while(p1 < p2 &&
                                                (*p1 = file.rdbuf()->sbumpc()) != EOF &&
                                                *p1 != ',' &&
                                                *p1 != '\n') ++p1;

                                if(p1 == p2) throw std::overflow_error("cell is too big!");
                                c = *p1;
                                if(p1 == cell_text)break;

                                char *p3 = cell_text;
                                while(p3 != p1 && isspace(*p3))++p3;

                                std::ios_base::iostate err = 0;
                                ng.get(p3,p1,file,err,v);

                                if(err & (ios::failbit | ios::badbit)) {
                                        throw std::invalid_argument("");
                                }
                                dane.push_back(v);
                        }
                }
                file.close();
          } else ShowMessage("Nie można otworzyć pliku");



Teraz takie coś:

[BCC32 Warning] FMain.cpp(118): W8006 Initializing std::_Iosb<int>::_Iostate with int
[BCC32 Error] FMain.cpp(119): E2285 Could not find a match for 'std::num_get<char,char *>::get(char *,char *,ifstream,std::_Iosb<int>::_Iostate,int)'




Troche zgłupiałem już : - )
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 12:46

[BCC32 Warning] FMain.cpp(118): W8006 Initializing std::_Iosb<int>::_Iostate with int

To akurat ostrzeżenie, nic poważnego. Spróbuj tak:
KOD cpp:     UKRYJ  
std::ios_base::iostate err = std::ios::goodbit;

powinno być git.

Jeśli chodzi o błąd, dodałeś wszystkie niezbędne nagłówki?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 12:49

Kod: Zaznacz cały
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <vector>


Takie mam. Warning zniknął.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 13:05

A gdzie <locale>, o którym wspomniałem?

Już chyba wiem, co jest przyczyną błędu. Niech v będzie typu long. Nie wiedzieć czemu nie ma wersji metody get, która w ostatnim parametrze przyjmuje int'a, choć - co dziwne - jest wersja dla unsigned int'a :zawiedziony: Prawdopodobnie u siebie testowałem to na typie unsigned, a na pewno na double.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Corvis
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 13:13

dokładnie tu był błąd zmieniłem int na LONG i jest OK - dzięki !!!!!!!!!!

Niewiem tylko czemu plik 92 MB po 8 lini w rzędzie robi na wersji RELEASE obrabia w 1,5 minuty. skoro u ciebie tak szybko ;P ( 7 sec troche mniejszy)
(Procek ( Intel Core Duo 2.GHZ) 3GB ramu.)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 13:25

No przecież masz profiler w nowym środowisku, powinieneś wiedzieć, gdzie jest wąskie gardło. Z drugiej strony trochę to dziwne, że u Ciebie w wersji release trwa to dłużej niż u mnie w wersji debug.

Jeśli plik jest mały po skompresowaniu, to udostępnij go. Sprawdzę u siebie.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 13:29

w załączniku
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 13:50

Dla 14137568 pozycji:
  • debug -> ~57,5 sek (4μs/pozycję)
  • release -> ~8 sek (0,56μs/pozycję)
Wniosek z tego taki, że albo coś pochrzaniłeś przy przełączaniu na release, i wersja ta nie jest w rzeczywistości wersją release, albo C++ Builder ma wyjątkowo nędzny kompilator tudzież implementację bibliotek (średnio w to wierzę).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Szybki parser CSV

Nowy postprzez Corvis » środa, 13 października 2010, 14:04

W załączniku program.
Możesz go odpalić otworzyć plik i wcisnąć rozpocznij ?? zobaczymy może to PC.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Szybki parser CSV

Nowy postprzez polymorphism » środa, 13 października 2010, 14:14

Brak BORLNDMM.DLL, CC32110MT.DLL i DWMAPI.DLL :twisted:
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości