Zum Inhalt springen

JeFi

Mitglieder
  • Gesamte Inhalte

    76
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von JeFi

  1. JeFi

    Zugriff auf dbf (dBase)

    Hi Amstelchen, danke für deine schnelle Antwort! Bisher habe ich noch nicht versucht die 40.000 Datensätze einzufügen sondern ca. 100. Selbst ein einfacher delete auf alle Zeilen Dauert gut 1 Minute! Und diese Zeiten sind doch nicht normal oder?
  2. Hallo, ich möchte gerne über eine Java-Anwendung Daten in eine DBF-Datei schreiben. Dazu nutze ich eine ODBC-Verbindung, da ich leider keinen kostenlosen JDBC-Treiber gefunden habe. Wenn ich jetzt ca. 100 Zeilen mit einem INSERT INTO einfüge braucht er dafür 1-2 Minuten! Da ich aber bis zu 40.000 Zeilen einfügen muss ist dies nicht akzeptabel. Hab ihr vielleicht einen Tip für mich was ich falsch mache bzw. wie es schneller geht? Connection = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft dBase Driver (*.dbf)};SourceType=DBF;DriverID=277;Exclusive=Yes;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;DefaultDir=c:\\Test"); PreparedStatement psArticle = connection.prepareStatement(" INSERT INTO artikel.dbf (LIDLNR,BEZ,PREIS,USTCODE,WARENGR,PFANDKZ,STATUSKZ,WAAGEKZ,TARAKZ,KARTONPLU,MENGE,KETTPLU,MODIFIED,GELOESCHT,KOLLIINHAL,SWWNR,REFUNDKZ,GLOBRABKZ,MINUSCODE,ABSCHRKZ,ALTERSKZ,STATUS,GEWICHTSKZ,VERKAUFSKZ,R_FILL) " + " VALUES(?,?,?,?,?,?,0,?,?,'0000',1,?," + currentDate + ",false,1,'','1','1',?,'1','0',10,?,0,'') "); HashSet<String> hsDoubleData = new HashSet<String>(1000); for (Article article : ((ArticleTableModel) tblArticleExport.getModel()).getArticles()) { if (hsDoubleData.add(article.getNo())) { psArticle.setString(1, article.getNo()); psArticle.setString(2, article.getDesc()); psArticle.setFloat(3, new Float(article.getPrice())); psArticle.setString(4, article.getTax()); psArticle.setString(5, article.getWareGroup()); psArticle.setString(6, article.getDeposit()); psArticle.setString(7, article.getScaleCode()); psArticle.setString(8, article.getTaraCode()); psArticle.setString(9, article.getKettPLU()); psArticle.setString(10, article.getDeposit()); psArticle.setByte(11, (byte) ((article.getWeightCode() == null || article.getWeightCode().equals("0")) ? 0 : 1)); psArticle.addBatch(); } } psArticle.executeBatch(); Für jeden Tip wäre ich sehr dankbar. Vielen Dank im Voraus!
  3. Hi Cobinja! Danke für deine schnelle Antwort. Mit String.split hatte ich es zuerst auch mal versucht dauerte aber länger also mit dem StringBuilder.substring! Oder lags an mir (wobei man dabei ja nicht viel falsch machen kann :hells: )
  4. Hallo, wie bereits aus dem Titel zu entnehmen ist möchte ich gerne eine Semikolon separierte Datei schnellst möglich einlesen.(und natürlich auch aufsplitten! Also nach ";" aufteilen und die einzelnen Datenfelder auslesen) Nun stellt sich mir die Frage, welche Variante ist die Schnellste und verbraucht am wenigsten Speicher? Vorschläge von mir wären da z.B.: 1. BufferdInputStream 2. BufferedReader Und die Zerteilung der einzelnen Datenfelder dann z.B. mit 1. Scanner 2. StringBuilder (indexof(";") und substring) 3. StringTokenizer Vielen Dank im Voraus
  5. Hi! Ich denke mal, das hier könnte dir vielleicht weiter helfen. this.addComponentListener(new ComponentAdapter(){ public void componentMoved(ComponentEvent e) { Main.this.setBounds(20, 20, 30, 30); } });
  6. @Jaraz ja ein Contest wäre echt nicht schlecht !!! Denke aber, dass das konvertieren von xls zu csv länger dauern dürfte!(der Schreibvorgang dauert sicherlich schon fast so lange wie mein auslesen) @bigredeyes warum sollte es denn Thread-safe sein? Arbeite doch auf unterschiedlichen Exceldateien mit unterschiedlichen JExcel-Workebookobjekten! Das einzige was ich syncronisiere ist: content.add(new Terminal(lineArray[0], lineArray[1], lineArray[2], new TerminalSerialNo(lineArray[3], lineArray[4]))); Aber was ich jetzt auf der Apacheseite gelesen habe ist, dass man via eventmodel schneller und Speicher schonender arbeiten kann! Hier wäre dann mal die Eventmodel-Variante von mir!(wenn jemand gobe Fehler sieht bitte melden!Contest ist eröffnet :bimei ) POI public static ArrayList<Terminal> checkTerminalChanges(final String sWHNo, final String sStoreNo, final GregorianCalendar gcFrom, final GregorianCalendar gcTo) { final HashSet<Terminal> content = new HashSet<Terminal>(12000); final ArrayList<Terminal> alResult = new ArrayList<Terminal>(); final ArrayList<File> files = new ArrayList<File>(); final String FILE_NAME_FROM = "SNr" + SDF_SNO.format(gcFrom.getTime()) + ".001.xls"; final String FILE_NAME_TO = "SNr" + SDF_SNO.format(gcTo.getTime()) + ".001.xls"; for (int i = gcFrom.get(GregorianCalendar.YEAR); i <= gcTo.get(GregorianCalendar.YEAR); i++) { final File dir = new File(hmFilePath.get(PathType.SERIALNR_PATH) + "\\" + i); final File[] f = dir.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return ((name.length() == 19) && (name.compareTo(FILE_NAME_FROM) >= 0) && (name.compareTo(FILE_NAME_TO) <= 0)); } }); if (f != null) { files.addAll(Arrays.asList(f)); } } try { final String STD_WH_NO = "00"; final String STD_STORE_NO = "0000"; final boolean IS_STD_WH = sWHNo.equals(STD_WH_NO); final boolean IS_STD_STORE = sStoreNo.equals(STD_STORE_NO); final byte WH_NO = 0; final byte STORE_NO = 1; final byte SM_ID = 3; final byte PP_ID = 4; final byte TID = 5; final int fileCount = files.size(); final Thread[] aThreads = new Thread[fileCount]; for (int i = 0; i < fileCount; i++) { final File tmpFile = files.get(i); aThreads[i] = new Thread() { public void run() { try { [B]HSSFEventFactory eventFactory = new HSSFEventFactory(); HSSFRequest request = new HSSFRequest(); request.addListenerForAllRecords(new HSSFListener() { // request.addListener(new HSSFListener(){ SSTRecord sstRecord; LabelSSTRecord textRecord; NumberRecord numberRecord; final String[] lineArray = new String[] { "", "", "", "" }; public void processRecord(Record arg0) { switch (arg0.getSid()) { case SSTRecord.sid: sstRecord = (SSTRecord) arg0; break; case NumberRecord.sid: numberRecord = (NumberRecord) arg0; switch (numberRecord.getColumn()) { case WH_NO: lineArray[0] = Integer.toString((int) numberRecord.getValue()); break; case STORE_NO: lineArray[1] = Integer.toString((int) numberRecord.getValue()); break; case SM_ID: lineArray[3] = Integer.toString((int) numberRecord.getValue()); break; case PP_ID: lineArray[3] += Integer.toString((int) numberRecord.getValue()); break; case TID: lineArray[2] = Integer.toString((int) numberRecord.getValue()); break; } break; case LabelSSTRecord.sid: textRecord = (LabelSSTRecord) arg0; if (textRecord.getColumn() == 11 && (IS_STD_WH || sWHNo.equals(lineArray[0])) && (IS_STD_STORE || sStoreNo.equals(lineArray[1])) && !lineArray[2].equals(lineArray[3])) { synchronized (content) { content.add(new Terminal(lineArray[0], lineArray[1], lineArray[2], new TerminalSerialNo(sstRecord.getString(textRecord.getSSTIndex()).toString(), lineArray[3]))); } } break; } } }); eventFactory.processWorkbookEvents(request, new POIFSFileSystem(new FileInputStream(tmpFile)));[/B] } catch (final Exception e) { JOptionPane.showMessageDialog(null, e.getStackTrace(), "FEHLER", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } } }; aThreads[i].start(); } for (final Thread myThread : aThreads) { myThread.join(); } for (final Terminal terminal : content) { if (terminal.getAlSerialNo().size() > 1) { terminal.sort(); alResult.add(terminal); } } } catch (final Exception e) { JOptionPane.showMessageDialog(null, e.getStackTrace(), "FEHLER", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); } return alResult; }
  7. Guten Morgen!!! Also im Terminal Konstruktor passiert nicht viel!(nur inizialisieren der Eigenschaften) Außerdem wurde der Konstruktor im vergleich zur csv Version nicht geändert und dürfte deshalb ja auch nicht zu den Performance einbußen führen. PS. Ups ich sehe gerade, dass ich in der JExcel die Terminal Objekte nicht zu content hinzufüge!(ist aber nur hier so! In der Variante die ich getestet habe läuft dies mit dem Hinzufügen ändert aber nichts am Problem!) Das was ich nicht verstehe ist, warum bei ODBC der Aufruf von getString so lange dauert? Und warum bei JExcel und POI so wahnsinnig viel Speicher verbraucht wird? Mache ich da so grobe Fehler oder ist das einfach so?
  8. Hallo, habe leider nur noch die Varianten mit ODBC und JExcel(und diese habe ich nochmal etwas aufs wesentliche reduziert!). Was bei ODBC so wahnsinnig lange Dauert ist der Aufruf der getString Methode! Das mit der Speicherbereinigung kenne ich! Aber ich wollte eigentlich für jede Datei einen extra Thread läufen lassen (bei der csv Version hatte mir dies ca. 30% gebracht). Wenn ich aber JExcel mit mehrere Thread laufen lasse bekomme ich eine out of Memory Exception(Was ich mir damit erkläre das er bei getSheet die ganze Datei in den Speicherliest und wenn das 10 Threads "gleichzeitig" tun ist dieser natürlich schnell voll)! Oder habe ich vielleicht sogar ein Speicherleck im Programm? JExcel: try { Workbook workbook = Workbook.getWorkbook(tmpFile); Sheet sheet = workbook.getSheet(0); String serialNo; String tid; for (int y = 1; y < sheet.getRows(); y++) { serialNo = sheet.getCell(3, y).getContents() + sheet.getCell(4,y).getContents(); tid = sheet.getCell(5, y).getContents(); if (!tid.equals(serialNo)) { new Terminal(sheet.getCell(0, y).getContents(), sheet.getCell(1, y).getContents(), tid, new TerminalSerialNo(sheet.getCell(9, y).getContents(), serialNo)); } } } workbook.close(); ODBC try { Connection conn = DriverManager.getConnection("jdbc:odbc:EC-ToolDBXls" + counter, "", ""); String sql = "SELECT ges, filiale, term_id, last_used, sm_id, pp_id FROM [Tabelle1$] WHERE term_id <> ((sm_id*10000)+pp_id)"; PreparedStatement pStmt = conn.prepareStatement(sql); ResultSet rSet = pStmt.executeQuery(); final String[] lineArray = new String[5]; while (rSet.next()) { lineArray[0] = rSet.getString(1); lineArray[1] = rSet.getString(2); lineArray[2] = rSet.getString(3); lineArray[3] = rSet.getString(4); lineArray[4] = rSet.getString(5) + rSet.getString(6); content.add(new Terminal(lineArray[0], lineArray[1], lineArray[2], new TerminalSerialNo(lineArray[3], lineArray[4]))); } pStmt.close(); conn.close(); } catch (final Exception e) { JOptionPane.showMessageDialog(null, e.getStackTrace(), "FEHLER", JOptionPane.ERROR_MESSAGE); e.printStackTrace(); }
  9. Hi! Diese wäre einfach zu aufwendig und noch langsamer für den Benutzer, da die Anzahl der Excel-Dateien im Extremfall über 300 liegen kann! Außerdem wäre es ja auch eine Speicherplatzverschwendung von mehreren 100 MB.
  10. Hallo. meine Aufgabe: Ich sollte ein Programm schreiben, welches Daten aus ca 10-50 csv-Dateien(Größe je Datei ca 1,3 MB und 11000 Zeilen mit 16 Spalten benötigt werden 6 Spalten) ließt und miteinander vergleicht. Diese Variante lief halbwegs Performant und Speicherschonend. Da nun aber die CSV Dateien durch Exceldateien ersetzt werden sollen muß ich also mein Programm auf Excel umstellen. Dies bedeutet ich muß also den Inhalt aus ca. 10-50 Exceldateien(Größe je Datei ca 2 MB und 11000 Zeilen mit 16 Spalten benötigt werden 6 Spalten) auslesen und vergleichen! mein Problem: Die Wartezeiten und der Speicherverbrauch sind im Vergleich zu der ersten csv-Variante einfach viel zu hoch und deshalb möchte ich euch fragen ob Ihr vielleicht einen guten Lösungsvorschlag habe. getestete Varianten(bei 10 Dateien): POI -> Speicherverbrauch ca. 65 MB und Dauer ca 10 Sek JExcel-> Speicherverbrauch ca. 60 MB und Dauer ca 10 Sek ODBC -> Speicherverbrauch ca. 40 MB und Dauer ca 20 Sek csv -> Speicherverbrauch ca. 40 MB und Dauer ca 5 Sek Vielen Dank im Voraus MfG JeFi
  11. Hallo! Wie aus dem Titel bereits zu entnehmen ist möchte ich gerne den gesamten Text eines JFormattedTextField´s markieren. Dies soll dann passieren, wenn der Benutzer diesem JFormattedTextField den Fokus gibt. Anbei der Quellcode mit dem ich es bisher versucht habe. (Um zu sehen ob er wenigstens Intern diese Markierung vornimmt habe ich die beiden sysout´s hinzugefügt! Und beide geben das gewünschte Ergebnis zurück!!! Nur die Markierung ist nicht zu sehen) tfWHNo = new JFormattedTextField(new DecimalFormat("000")); tfWHNo.addFocusListener(new FocusAdapter(){ public void focusGained(FocusEvent e) { tfWHNo.selectAll(); System.out.println(tfWHNo.getSelectedText()); System.out.println(tfWHNo.getCaretPosition()); } }); Vielen Dank im Voraus
  12. HalliHallo Ja also ich hatte da schon drauf geachtet sprich ich habe jetzt alles auf utf-8 eingestellt.
  13. Hi! Ja habe gerade auch so etwas gefunden gehabt! Aber leider scheint das auch nicht zu gehen! Sprich wenn ich über Java abspeicher wird aus einem ä zb schwarzes Viereck! Wenn ich das dann über Java wieder einlese ist alles ok und er zeigt mir das ä richtig an! Wenn ich jetzt aber "per hand" die Daten in die DB mit einem INSERT Statement eintrage dann stehen sie zwar mit ä drin aber wenn ich dann über Java abfrage kommt er damit natürlich nicht klar! Kurz bisher ist das ganze nur Java - Java oder MySql - MySql kompatibel!(möchte aber auch gerne ne Mischform ermöglichen und da hatte ich eigentlich auch auf das characterEncoding gesetzt gehabt was leider nicht geht )
  14. Hallo und danke erstmal! Wenn ich mir aber das so anschaue kann ich mit dem Befehl nur die Kodierung in der DB setzen! Da aber die Datenbank die Umlaute und Sonderzeichen wegspeichern kann, denke ich mal, dass es an der Komunikation zwischen Java Programm und DB liegt! Sprich der könnte Connector das Problem sein! Aber dürfte doch eigentlich nicht so schwer sein oder? Schließlich hat sicherlich jeder von euch in seiner DB die Umlaute und Sonderzeichen! Wie ist das denn bei euch? :confused:
  15. Hallo ich habe folgendes Problem ich möchte aus einer MySQL Datenbank Texte mit Umlauten und Sonderzeichen abfragen! Nun scheint das Problem die Zeichensatzkodierung zu sein!!! Wenn ich Daten mit Umlauten im ResultSet stehen hatte bekam ich anstelle eines ß irgentwelche anderen komischen Zeichen!(die konnte ich umgehen indem ich nicht ResultSet.getString() sonder new String(ResultSet.getBytes()) aufgerufen hatte)! Nun dachte ich sei mein Problem gelöst gewesen bis ich in meinem SELECT Statement auch ein Sonderzeichen hatte!!! Nun meine Frage weiß jemand wie man die Zeichenkodierung festsetzen kann? (im MySql Programm kann ich ohne weiteres mit Umlauten arbeiten! nur wenn ich den weg über Java gehe funktioniert es nicht! kann es am Connector liegen??) vielen Dank im Voraus
  16. hehe danke! Wenn gleich 2 Leute mir den gleichen Tip geben muss es ja das richtige sein! Habe das ebend mal überflogen und muss sagen das es sehr gut aussieht! Also erstmal vielen Dank! ich probiere es gleich mal aus!!! :e@sy
  17. Hallo ich möchte mir ein Java-Programm schreiben, welches mir die Möglichkeit geben soll eine Exceldatei auszulesen.(das ganze soll unter Linux laufen) Wie bekomme ich das am besten hin? Weiß das es unter Windows über einen ODBC Treiber geht!(mit dem habe ich die Möglichkeit die Exceldatei wie eine ganz normale DB anzusprechen!) Aber für Linux habe ich so einen Treiber noch nicht gefunden!(hatte nach ODBC und JDBC Treiber für Excel geschaut) Vielen Dank im Voraus
  18. JeFi

    Speicher freigeben

    aha also auch Membervariablen! bin nur irritiert da ich zur Zeit mit QT(GUI Bibiolothek) arbeite und da stand im Buch das die QT-Memberobjekte automatisch gelöscht werden sobald das "Hauptobjekt" deleted wird!
  19. Hallo ich habe folgende Frage: wenn ich ein Objekt von meiner selbst geschriebenen Klasse mit new erzeuge(Diese Klassen enthält auch Zeiger auf weiter Objekte) muss ich dann die einzelnen Objekte mit delete löschen oder reicht es wenn ich das Obejekt lösche, welches die anderen Objekte beinhaltet!?! oder anders gefragt bleiben die enthaltenen Objekte auf jedem Fall am Leben wenn ich sie nicht explizit mit delete lösche oder gibts da Unterschiede zwischen meinen "eigenen Objekten" und den standard vorhanden? vielen Dank im voraus
  20. Aha ist ja eher unschön aber hatte ich schon fast befürchtet! PS: danke für die schnelle Antwort
  21. Hallo ich möchte gerne ein Objekt (z.B. Person) in eine Datei speichern! In Java geht das ganz einfach(Interface implementieren und dann Objekt wegspeichern). In C++ habe ich dafür noch keine passende Methode gefunden :-(! Oder muss ich jede einzelne Eigenschaft "per Hand" wegspeichern? Danke im Voraus! PS: wenn jemand vielleicht da auch was zu QT weiß wäre das mir noch lieber!!
  22. Hmmmm ja aber wirklich schön finde ich das so auch nicht da hätte ich doch schon am liebsten meine anonymen Klassen! Aber da es unter C++ sowas wohl nicht gibt muss ich wohl so in der Art das ganze lösen!(Naja C++ ist halt kein Java ) Also vielen Dank habt mir echt geholfen!
  23. ;-) OKI werde mir Mühe geben! Na dann könnte ich das doch nicht so machen wie in deinem Beispiel machen! Und müsste dann für jeden Button eine extra Klasse anlegen!
  24. Ja da habe ich dich schon verstanden! Aber was ist wenn einer einen Text setzt und der andere einen Text ausliest wieder ein anderer stelle ne DB connection her usw was dann!!?!?
  25. Die Methode mousePressEvent ( QMouseEvent * e ) ist aber eine Methode aus der Klasse QPushButton und diese wird automatisch aufgerufen wenn ich den Button anklicke.(ein MouseEvent würde ausgelöst werden) Wenn ich den jetzt anders parametrisieren würde mousePressEvent ( QMouseEvent * e, QString s ) dann würde das nichts bringen weil er weiterhin die mousePressEvent ( QMouseEvent * e ) Methode ausrufen würde! Und nun sollte er halt unterschiedlich reagieren wenn diese Methode aufgerufen wird(dazu ist sie ja auch da) und dann würde mir ja nur übrig bleiben diese Methode jedes mal zu überschreiben(wie das in Java auch der Fall ist) blos das ich wohl nicht wie in Java eine anonyome Klasse erzeugen kann sonder ich muss eine extra Klasse schreiben und das halte ich in diesem Falle nicht für sinnvoll und umständlicher!

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...