παπι Δημοσ. 6 Δεκεμβρίου 2013 Δημοσ. 6 Δεκεμβρίου 2013 Λοιπον, τα data που θελω ειναι μια ημερομηνια, ή ωρα ή και τα δυο. Εκτος απο δαυτη, θελω και 4 float και ενα long ή int ή float whateva. Σε γενικες γραμμες ειναι στανταρακι. παραδειγμα data Trade Date;High;Low;Open;Close;Volume;Prev. Close;Total Turnover;Num. Of Trans.; 8/12/2008;20,560;19,600;19,980;20,460;652899;19,260;13280090,900;1037 9/12/2008;20,980;20,300;20,460;20,980;760641;20,460;15763607,360;1200 10/12/2008;21,500;20,700;21,280;21,200;1041187;20,980;22106307,220;1386 αλλο παραδειγμα Time;Open;High;Low;Close;Volume; 17:16:00;1,500;1,500;1,500;1,500;4100 17:14:00;1,500;1,500;1,500;1,500;1500 17:13:00;1,500;1,500;1,500;1,500;4000 και αλλο παραδειγμα Date,Open,High,Low,Close,Volume,Adj Close 2013-12-05,38.24,39.31,38.05,38.87,27650300,38.87 2013-12-04,36.47,38.15,36.25,38.13,26127800,38.13 2013-12-03,36.77,37.07,36.34,36.56,14061800,36.56 2013-12-02,37.04,37.15,36.68,37.01,11471700,37.01 2013-11-29,36.91,37.35,36.90,36.98,6455400,36.98 2013-11-27,36.70,37.12,36.51,36.96,10413200,36.96 και αλλα πολλα και διαφορα. Με διαφορα locals και formats Αλλα οπως ειπα, σε γενικες γραμμες ειναι τα ιδια data. Date open, close, high, low, volume Αυτο που εχω κανει τωρα ειναι τουτο Εχω 3 πεδια. 1) το src πχ http://ichart.finance.yahoo.com/table.csv?s=YHOO&d=11&e=6&f=2013&g=d&a=3&b=12&c=1996&ignore=.csv 2) το regex 3) ενα map για τα groups. Η ιδεα ειναι απλη, φτιαχνω ενα απλο regex με τα groupακια του, και επειτα mapαρω τα groupακια. πχ στο screen shot το d λεει οτι το πρωτο group ειναι day, το M λεει οτι το δευτερο groupακι ειναι month κλπ κλπ Βεβαια αυτο δεν μου γεμιζει το ματι, για αυτο οποια ιδεα ευπροσδεκτη.
παπι Δημοσ. 9 Δεκεμβρίου 2013 Μέλος Δημοσ. 9 Δεκεμβρίου 2013 Δεν ρωτω αλλα ζητω καμια αλλη ιδεα. Αν το θες με ερωτηση, οκ... Πως θα το εκανες το παραπανω;
migf1 Δημοσ. 9 Δεκεμβρίου 2013 Δημοσ. 9 Δεκεμβρίου 2013 Δεν έχω πολυ-καταλάβει, αλλά αν η σειρά των στηλών είναι πάντα η ίδια, π.χ. αν στο αρχείο που δίνεις ως παράδειγμα η σειρά των στηλών είναι πάντα η... Date,Open,High,Low,Close,Volume,Adj Closeκι αν είναι να λείπει κάτι θα λείπει μόνο από τα δεξιά, τότε θα μπορούσες υποθέτω να γράψεις έναν μικρό parser που θα σου επιστρέφει το πλήθος των tokens που διάβασε, καθώς και ένα array με τα tokens που διάβασε. Οπότε από εκεί και πέρα είναι εύκολο να τα κάνεις treat όπως θέλεις (δηλαδή το 1ο ως Date, το 2ο ως Open, κλπ). Αν το input είναι πάντα πλήρες στο πλήθος των στηλών του, όπως είναι στο αρχείο που δίνεις ως παράδειγμα, μπορείς να πάρεις τα tokens της κάθε γραμμής με απλό sscanf()... βέβαια αν έχεις διαφορετικά locale (αλήθεια από που καταλαβαίνεις το locale? στο αρχείο δείγμα δεν υπάρχει σχετική πληροφορία... ίσως διαβάζεις το locale του client, δεν ξέρω τι ακριβώς κάνεις) τότε μάλλον εξυπηρετεί να κάνεις δικό σου parser. Οπότε κάτι σαν το παρακάτω βολεύει; init( data, MAX_DATA ); for (i=0; i < MAX_DATA && not eof; i++) { read( line ) ntokens = parser(line, tokens); /* get all data[i] fields from tokens array (this could be a separate function, e.g.: get_idata(&data[i], tokens) ) */ if ( ntokens > 0 ) data[i].date = get_date(tokens[0]); if ( ntokens > 1 ) data[i].Open = get_open(tokens[1]); ... if ( ntokens > 6 ) data[i].adjclose = get_adjclose(tokens[6]); } Για κάθε διαφορετικό φορμά αρχείου θα μπορείς να έχεις διαφορετικές parser() και get_idata() συναρτήσεις. Πόσα είναι τα διαφορετικά φορμά input που μπορεί να έχεις; Υποθέτω δεν θα ξεπερνάνε τα 5-6. Νομίζω έτσι βγάζεις πιο κατανοητό και πιο καλά οργανωμένο κώδικα από το να έχεις έναν γενικό parser για όλα τα φορμά (άσε που δεν ξέρω και κατά πόσο είναι εφικτό να κάνεις γενικό parser αν έχεις ανομοιογενή φορμά input). Αν τα delimiters σου είναι κοινά σε όλα τα input σου, κι αλλάζει μονάχα το πλήθος και το είδος των στηλών, θα μπορούσες υποθέτω να έχεις και κάτι σαν table αναγνώρισης για το καθένα τους (για το data δηλαδή), και να το περνάς στην get_idata() για να κάνει assign τιμές στα κατάλληλα πεδία ανάλογα τη μορφή data που διαβάζει την κάθε φορά. Aν και αυτό το generalization μιας ας τη πούμε πιο high-level get_idata() έχει περισσότερο σχεδιαστικό νόημα υπό προϋποθέσεις παρά λειτουργικό.
defacer Δημοσ. 9 Δεκεμβρίου 2013 Δημοσ. 9 Δεκεμβρίου 2013 Θα μπορούσες κατ' ελάχιστο να ξεφορτωθείς το πεδίο της regex. Υποθέτοντας πως δεν μπορείς από τα data να δεις τη σειρά των πεδίων (αν μπορούσες τότε πάμε σε fully automated), μπορείς από το πεδίο groups να πάρεις δεδομένα με τα οποία θα φτιάξεις τη regex επιτόπου. Προφανώς το μόνο σου πρόβλημα είναι πώς να σιγουρευτείς ότι χρησιμοποιείς τους σωστούς delimiters (αυτό το κόμμα ειδικά που είναι πανούργο). Λοιπόν αν κάνεις match /(?<=\d)\D(?=\d)/ τα matches που θα πάρεις θα είναι οι πιθανοί delimiters. Συγκεκριμένα, κάνεις group by match reverse sort by count και πρώτο πρώτο έχεις τον delimiter που χρησιμοποιεί το αρχείο σου. Από τη στιγμή που το έχεις αυτό τότε μπορείς απλά να κάνεις το split σε πεδία (σύμφωνα με το group που έδωσες -- btw το date πλέον θα το κάνεις ένα μόνο πεδίο αντί για 3) και στη συνέχεια πολύ εύκολα παρσάρεις τα νούμερα. Για το date/time θα σου πρότεινα να βάλεις μερικά formats (ή να χρησιμοποιήσεις Culture objects έτοιμα με τα format τους) και να δοκιμάσεις διάφορα TryParse. Αν μόνο ένα format ενός culture πετύχει τότε ξέρεις τι είναι. Αν πετύχουν διάφορα format σε πολλά culture τότε απλά κοιτάς μήπως πάρσαραν στο ίδιο αποτέλεσμα οπότε χρησιμοποιείς αυτό. Αν όχι... έλα να ποστάρεις τι έγινε να σκεφτούμε κάτι καλύτερο.
παπι Δημοσ. 9 Δεκεμβρίου 2013 Μέλος Δημοσ. 9 Δεκεμβρίου 2013 , μπορείς από το πεδίο groups να πάρεις δεδομένα με τα οποία θα φτιάξεις τη regex επιτόπου. Χμμ, καλο ακουγεται. @μιγ δεν θελω τοσο low level, θελω high level, βασικα το θελω πολυ high level, πχ βλεπω αυτα τα δεδομενα. http://bitcoincharts.com/markets/mtgoxUSD_trades.html γραφω ενα regexοειδη και παιρνω τα data on the fly. Υγ: για το local που λες, δες τους float. Οι μεν ειναι με , και οι δε με .
migf1 Δημοσ. 10 Δεκεμβρίου 2013 Δημοσ. 10 Δεκεμβρίου 2013 Οκ, απλώς δεν είμαι σίγουρος αν τα . και , σε float είναι ασφαλής συνθήκη για να αποφασίσεις το locale όλων των πεδίων. Δεν θυμάμαι π.χ. αν το . σε float είναι ικανό να σου δώσει ασφαλές συμπέρασμα και για την date (ούτε το αντίστροφο) οπότε τσέκαρέ το ΥΓ. Τελικά η σειρά των στηλών σε ένα είδος input μπορεί να αλλάζει ή όχι; Μπορεί π.χ. σε ίδιο τύπο input να μην έχεις ας πούμε Date και να ξεκινάει με Open; Αν ναι, τότε αυτό που πόσταρα δεν δουλεύει έτσι κι αλλιώς.
παπι Δημοσ. 10 Δεκεμβρίου 2013 Μέλος Δημοσ. 10 Δεκεμβρίου 2013 Ωχ, Παναγια μου... το winapi δεν εχει μια κωλοσυναρτηση για datetime parse... μιγ, εαν αλλαζε η σειρα των στηλων στο ιδιο format.... ε τοτε θα εγραφα τις τιμες μια μια με το χερι
migf1 Δημοσ. 10 Δεκεμβρίου 2013 Δημοσ. 10 Δεκεμβρίου 2013 Ωχ, Παναγια μου... το winapi δεν εχει μια κωλοσυναρτηση για datetime parse.. ... Άμα ξέρεις τα delimiters των locale, κάντες sscanf() από το διαβασμένο token τους.
defacer Δημοσ. 10 Δεκεμβρίου 2013 Δημοσ. 10 Δεκεμβρίου 2013 Ωχ, Παναγια μου... το winapi δεν εχει μια κωλοσυναρτηση για datetime parse... http://www.boost.org/doc/libs/1_55_0/doc/html/date_time/examples.html BTW πριν που έλεγα για Culture νόμιζα πως ήταν σε .NET αυτό... γιατί όχι; Much easier.
παπι Δημοσ. 10 Δεκεμβρίου 2013 Μέλος Δημοσ. 10 Δεκεμβρίου 2013 Παει το regex Βεβαια τωρα δεν εχω regex χαχαχαχαχα. Πειναει κανεις; Εχω μακαροναδα
παπι Δημοσ. 10 Δεκεμβρίου 2013 Μέλος Δημοσ. 10 Δεκεμβρίου 2013 Και πως θα κανω parse πχ αυτο http://bitcoincharts.com/markets/mtgoxUSD_trades.html Η μακαροναδα δεν χωρεσε χαχαχα
migf1 Δημοσ. 10 Δεκεμβρίου 2013 Δημοσ. 10 Δεκεμβρίου 2013 Που είναι η δυσκολία ρε συ; Δεν έχω καταλάβει. Εγώ τα βλέπω μια χαρά well-formatted τα data.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα