Evangeli Δημοσ. 27 Αυγούστου 2009 Δημοσ. 27 Αυγούστου 2009 Καλησπέρα σε όλους. Για ακόμα μια φορά χρειάζομαι την σημαντική βοήθεια σας. Ο κώδικας που ακολουθεί είναι η προσπάθεια μου για α) την ανάγνωση 2 strings από κάθε σειρά του .txt αρχείου. Η κάθε σειρά έχει την εξής δομή: 2009-06-28 2 2009-06-29 1 2009-05-01 6 2009-07-16 3 ... με το πρώτο string να εκφράζει μια ημερομηνία ενώ το δεύτερο string έναν ακέραιο. β) την μετατροπή του πρώτου string σε date και του δεύτερου σε int. Με το δεύτερο είμαι εντάξει. Το πρόβλημα μου αφορά τη πρώτη μετατροπή. Όπως είπα, το format που είναι τώρα το String-Date είναι 2009-06-28. Εγώ χρειάζομαι 1) την μετατροπή του String-Date σε Date παράλληλα με 2) την αλλαγή του format σε 28/6/2009. Τέλος, τα αποτελέσματα που παίρνω αυτή την στιγμή είναι κάπως έτσι: sDate: 2009-05-18 date: Sun Jan 18 00:05:00 EET 2009 sOccurrence: 1 iOccurrences: 1 ... >try { myArray = new Object[numOfLines][2]; // Read the file line-by-line while ( (strLine = br.readLine()) != null ) { // Print the content on the console //System.out.println(strLine); StringTokenizer stringTokenizer = new StringTokenizer(strLine); numOfTokens += stringTokenizer.countTokens(); j = 0; // Store all the data to a table while (stringTokenizer.hasMoreTokens()) { // Format pou exw: 2009-06-28 // Format pou 8elw: 23/1/1985 sDate = stringTokenizer.nextToken(); System.out.println("sDate: " + sDate); String str_date = sDate; SimpleDateFormat formatter ; Date date ; formatter = new SimpleDateFormat("yyyy-mm-dd"); date = (Date)formatter.parse(str_date); Calendar cal = Calendar.getInstance(); cal.setTime(date); System.out.println("date: " + date); sOccurrence = stringTokenizer.nextToken(); System.out.println("sOccurrence: " + sOccurrence); iOccurrence = Integer.parseInt(sOccurrence); System.out.println("iOccurrences: " + iOccurrence); myArray[j][0] = new Integer(iOccurrence); j++; } } System.out.println("Number of total tokens generated: " + numOfTokens); } catch (Exception e) { // Catch exception if any System.err.println("Error: " + e.getMessage()); } Προσπάθησα αρκετά αλλά δεν μπορώ να βρω κάτι. Ίσως φταίει ότι με πιέζει ο χρόνος. Οποιαδήποτε ιδέα είναι καλοδεχούμενη Βαγγέλης.
Επισκέπτης Δημοσ. 27 Αυγούστου 2009 Δημοσ. 27 Αυγούστου 2009 > public String DATE_TO_STRING(java.util.Date date) throws NullPointerException{ SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy"); return sdf.format(date); } public Date STRING_TO_DATE(String stringDate) throws ParseException{ SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy"); return sdf.parse(stringDate); } με βάση τα παραπάνω κάνεις αλλαγές, αν χρειαστεί...
Evangeli Δημοσ. 27 Αυγούστου 2009 Μέλος Δημοσ. 27 Αυγούστου 2009 > public String DATE_TO_STRING(java.util.Date date) throws NullPointerException{ SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy"); return sdf.format(date); } public Date STRING_TO_DATE(String stringDate) throws ParseException{ SimpleDateFormat sdf = new SimpleDateFormat("dd/M/yyyy"); return sdf.parse(stringDate); } με βάση τα παραπάνω κάνεις αλλαγές, αν χρειαστεί... Σ' ευχαριστώ φίλε natural_sgf για την άμεση απάντηση! Προσπαθώ με μια εντολή τύπου myArray[j][0] = new Date(dDate); να καταχωρίσω την συγκεκριμένη ημερομηνία σε ένα πίνακα τύπου myArray = new Object[numOfLines][2]; αλλα το Netbeans μου λέει οτι δεν υπάρχει Constractor τέτοιου τύπου LOL! Τι μπορώ να κάνω? Κάτι έχω διαβάσει για τον τύπο Calendar αλλα δεν γνωρίζω πως να τον χρησιμοποιήσω... Και κάτι ακόμα. Και αυτή την φορά η ημερομηνία εμφανίζεται υπο την εξής μορφή: Wed Dec 10 00:00:00 EET 2008. Μπορώ να την φορμάρω στην μορφή 23/1/1985. Το ειδανικό σενάριο θα ήταν να μπορώ να απομονόσω τα a) year date c) month!
Επισκέπτης Δημοσ. 27 Αυγούστου 2009 Δημοσ. 27 Αυγούστου 2009 το myArray το έχεις δηλώσει τύπου Object οπότε δυο πιθανές λύσεις: 1. το δηλώνεις myArray = new Date[numOfLines][2]; 2. το κρατάς όπως ειναι και το Date το κανεις cast σε Object(upcast δηλαδή) πρωτού το κάνεις ανάθεση σε στοιχείο του πίνακα...μετά βεβαια, για να το χρησιμοποιήσεις πρεπει να το κάνεις πάλι downcast σε τύπο Date... Για το δευτερο σκέλος της ερώτησης, κοίτα αυτό και αυτό και φυσικά το Java API που έχεις παραβλέψει να συμβουλευτείς...
Evangeli Δημοσ. 27 Αυγούστου 2009 Μέλος Δημοσ. 27 Αυγούστου 2009 το myArray το έχεις δηλώσει τύπου Object οπότε δυο πιθανές λύσεις:1. το δηλώνεις myArray = new Date[numOfLines][2]; Στην περίπτωση αυτή όμως θα μπορώ να αποθηκεύω int τιμές στα κελιά Date[...κάτι...][1]? ή όλα τα κελιά είτε βρίσκοντε στην πρώτη είτε στην δευτερη στήλη θα "δέχοντε" αποκλειστικά dates?
Επισκέπτης Δημοσ. 28 Αυγούστου 2009 Δημοσ. 28 Αυγούστου 2009 αφού θες να αποθηκεύσεις διαφορετικού τύπου δεδομένα κ αν πρέπει και καλά να κάνεις χρήση δισδιάστατου πίνακα ακολούθησε τον δεύτερο τρόπο χρησιμοποιώντας παράλληλα το instanceof για να καταλάβεις τι είδους αντικείμενο έχεις προτού το κάνεις downcast...
Evangeli Δημοσ. 28 Αυγούστου 2009 Μέλος Δημοσ. 28 Αυγούστου 2009 αφού θες να αποθηκεύσεις διαφορετικού τύπου δεδομένα κ αν πρέπει και καλά να κάνεις χρήση δισδιάστατου πίνακα ακολούθησε τον δεύτερο τρόπο χρησιμοποιώντας παράλληλα το instanceof για να καταλάβεις τι είδους αντικείμενο έχεις προτού το κάνεις downcast... Okay. Επειδή βλέπω οτι το πράγμα δυσκολεύει και δε μπορώ σε αυτή την φάση να καλύψω ότι ασχετοσύνη έχω, λέω να κάνω τα εξής και μου λες αν θες την γνώμη σου. Φτιάχνω δυο μονοδιάστατους πίνακες με το ίδιο πλήθος στοιχείων. Έναν για τύπου ακραίων και έναν τύπου Date. Τους δηλώνω έχω εξής: num = new int; Πως όμως δηλώνω και τον πίνακα των dates? Μήπως η μόνη λύση είναι με ArrayList? > ArrayList<Date> a = new ArrayList<Date>(); DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); DateCompare compare = new DateCompare(); try { Date three = df.parse("1991-10-01"); a.add(today); } Μετά κάνω απλά αντιστοίχηση. π.χ. το 1 στοιχείο της arraylist αντιστοιχίζεται με το 1 του int-πίνακα. Επειδή όμως είναι ανάγκη να γνωρίζω ανά πάσα στιγμή τα έτος,μήνας,ημέρα της κάθε ημερομηνίας, μπορώ να κάνω ανάκτηση των πληροφοριών αυτών με κάποια συνάρτηση της java?
Επισκέπτης Δημοσ. 28 Αυγούστου 2009 Δημοσ. 28 Αυγούστου 2009 ξέρεις τι ειναι struct στη C? αν θες να κάνεις το αντιστοιχο του struct στη Java πως θα το έκανες;;; τέλως πάντων...η λύση, για να μη το κάνεις πιο πολύπλοκο απ' ότι πρέπει, ειναι να δηλώνεις μια κλάση > private class MyStruct { private Date date; private int num; //constructor MyStruct(Date date, int num){ this.date = date; this.num = num; } protected Date getDate(){ return this.date; } protected void setDate(Date date){ this.date = date; } protected int getNum(){ return this.num; } protected void setNum(int num){ this.num = num; } } οπότε κάνοντας χρήση του παρακάτω κώδικα >private java.util.List<MyStruct> myList = new ArrayList<MyStruct>(DEFINE_YOUR_NUMBER); Date today = new Date(); MyStruct newMyStruct = new MyStruct(today, 1); myList.add(newMyStruct); θα έχεις το επιθυμητό αποτελεσμα...τα υπολοιπα ψάξτα μόνος σου... Όσον αφορά το Year που λες κοιτα το link που αναφέρομαι στο Java API πιο πάνω καθώς σε παραπέμπω απευθειας στην κλάση Calendar και συγκεκριμένα στο πεδίο YEAR... καλή συνέχεια...
virxen75 Δημοσ. 29 Αυγούστου 2009 Δημοσ. 29 Αυγούστου 2009 δεν ξέρω αν θέλεις κάτι σαν αυτό δες το και πες μου ReadData.zip
Evangeli Δημοσ. 29 Αυγούστου 2009 Μέλος Δημοσ. 29 Αυγούστου 2009 δεν ξέρω αν θέλεις κάτι σαν αυτόδες το και πες μου Παίδες σας ευχαριστώ όλους. Τελικά το πρόβλημα ήταν μπροστά στα μάτια μου. Το έλυσα με άλλο τρόπο χωρίς να παίζω με java και jExcelAPI. Για την ιστορία, κατάφερα να υλοποιήσω αυτό που θέλω με κάποια τροποποίηση τον κώδικα που μου έστειλε ο virxen75. Έμεινε μόνο μια μικρή λεπτομέρεια που ίσως λυνόταν με αλχημείες του excel. Απλά σκέφτηκα ότι από την στιγμή τα δεδομένα ήταν ήδη αποθηκευμένα σε txt σε μορφή space separated values πολύ απλά θα μπορούσαν να γίνουν import από αυτό και το καλύτερο: Αναγνωρίζοντας από μόνο του αν οι τιμές είναι τύπου date, number κλπ κλπ. Τελικά μερικές φορές η λύση είναι πολύ πιο απλή απ όσο περιμένουμε! Ευχαριστώ και πάλι!!!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.