Anybody... :( ?
Java szukanie wartosci w kolumnie
- Rejestracja: dni
- Ostatnio: dni
Możesz przekazywać nazwę pliku jako parametr java TwojaKlasa nazwaPliku. Wtedy nazwa pliku jest w parametrze args metody main (dokładniej, w args[0]).
Mozesz spytać o nazwę pliku po uruchomieniu programu, np. tak.
Console con = System.console();
String fileName = con.readLine("Podaj nazwe pliku: ");
- Rejestracja: dni
- Ostatnio: dni
public static void main(String[] args)
Mówi Ci to coś?
- Rejestracja: dni
- Ostatnio: dni
Mówi, nie rozumiem co chcesz mi zasugerować.
- Rejestracja: dni
- Ostatnio: dni
Dobra, trochę oczyściłem program chodź dalej w konsoli wysypuje mi błędy. Próbowałem już wszystkich importów. Pomóżcie, proszę:
[code]
package com.csvreader;
import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;
public final class CSVTable {
public CSVTable(String title, String source) throws NumberFormatException {
InputStream is;
try {
File f = new File(source);
is = new FileInputStream(f);
insertData(is);
}catch(IOException ioe) {
}
}
void insertData(InputStream is) throws FileNotFoundException, IOException, NumberFormatException {
Scanner scan = new Scanner(is);
String n = scan.toString();
String[][] line = new String[n.length()][13];
String line1;
int row =0;
int col =0;
while (scan.hasNextLine()) {
line1 = scan.nextLine();
StringTokenizer st = new StringTokenizer(line1, ";", false);
while (st.hasMoreTokens()) {
line[row][col] = st.nextToken();
col++;
}
col = 0;
row++;
}
for (int i = 1; i < line.length; i++)
{
if(!line[i-1][2].equals(line[i][2])) {
int b = Integer.parseInt(line[i-1][1]);
int c = Integer.parseInt(line[i-1][2]);
int d = Integer.parseInt(line[i][1]);
int f = Integer.parseInt(line[i][2]);
String outputFile = "C:\\Documents and Settings\\Vieckov\\Pulpit\\Wynik\\wynik1.csv";
boolean alreadyExists = new File(outputFile).exists();
try {
CsvWriter nowy = new CsvWriter(new FileWriter(outputFile, true), ';');
nowy.write(line[i-1][0].substring(0, 19));
nowy.write(line[i-1][1]+" ("+Integer.toHexString(b)+")");
nowy.write(line[i-1][2]+" ("+Integer.toHexString(c)+")");
nowy.write(line[i-1][8]);
nowy.write(line[i-1][4]);
nowy.write(line[i][1]+" ("+Integer.toHexString(d)+")");
nowy.write(line[i][2]+" ("+Integer.toHexString(f)+")");
nowy.write(line[i][8]);
nowy.write(line[i][4]);
nowy.write(line[i][6]);
nowy.write(line[i][7]);
nowy.write(line[i][5]);
nowy.write(line[i][9]);
nowy.write(line[i][10]);
nowy.write(line[i][11]);
nowy.write(line[i][12]);
nowy.endRecord();
nowy.close();
} catch (NumberFormatException | IOException | NullPointerException e)
{
}
}
}
String imie;
Scanner odczyt = new Scanner(System.in);
imie = odczyt.nextLine();
System.out.println("podaj plik "+is);
}
public static void main(String args[]) throws IOException, NullPointerException, NumberFormatException {
try {
CSVTable frame = new CSVTable("input","X004402141929004_1334824654152.csv");
} catch (NumberFormatException | NullPointerException q) {
}
}
}
[/code]
W Netbeansie ładnie się kompiluje a w konsoli wysypuje następujące błędy:
CSVTable.java:51: error: cannot find symbol
CsvWriter nowy = new CsvWriter(new FileWriter(outputFile, true), ';');
^
symbol: class CsvWriter
location: class CSVTable
CSVTable.java:51: error: cannot find symbol
CsvWriter nowy = new CsvWriter(new FileWriter(outputFile, true), ';');
^
symbol: class CsvWriter
location: class CSVTable
2 errors
- Rejestracja: dni
- Ostatnio: dni
Komunikat jest jednoznaczny, brakuje klasy CSVWriter. To nie jest standardowa klasa Javy, musisz ją umieścić w tym samy katalogu, w którym jest klasa CSVTable.
P.S. Ty nazywasz ten kod oczyszczonym? To jest jeden wielki śmieć.
- Rejestracja: dni
- Ostatnio: dni
Jestem w cholere początkujący dllatego więc to jest śmieć. Co mam wrzucić w tej nowej klasie CSVWriter. ?
- Rejestracja: dni
- Ostatnio: dni
Skoro w NetBeans się kompiluje, to klasa CSVWriter istnieje. Może przypadkowo dodałeś do projektu w NetBeans jara, który zawiera te klasę.
- Rejestracja: dni
- Ostatnio: dni
ok, dodałem tą klasę do folderu z klasą CSVTable. Kompiluje się ale przy uruchomieniu z terminala wywala mi taki błąd:
Exception in thread "main" java.lang.NoClassDefFoundError: CSVTable (wrong name: com/csvreader/CSVTable)
Próbowałem coś z tą zmienną środowiskową ale nie wiem za bardzo jak. Plik .class jest w tym samym folderze. Polecenie java -cp . CSVTable.java nie działa
- Rejestracja: dni
- Ostatnio: dni
Skorzystałem z Waszej pomocy:
Wpierw
javac -cp lista_plików.jar NaszaKlasa.java
Skompilowało mi się i teraz:
javac -cp ./:lista_plikow.jar NaszaKlasa
i dalej wyskakuje ten błąd:
Exception in thread "main" java.lang.NoClassDefFoundError: CSVTable (wrong name: com/csvreader/CSVTable)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
- Rejestracja: dni
- Ostatnio: dni
Jeśli w definicji klasy jest deklaracja
package com.cvsreader.CVSTable;
to klasa CVSTable musi być w podkatalogu com/cvsreader względem katalogu bieżącego (tego w którym wpisujesz polecenie java ...).
- Rejestracja: dni
- Ostatnio: dni
Jestem wdzięczny za pomoc ale mógłbyś mi wytłumaczyć jak debilowi bo próbuje cały dzien z tym walczyc i nic mi nie wychodzi...
- Rejestracja: dni
- Ostatnio: dni
Powiedzmy mam katalog moj/
w tym katalogu trzymam tego jara czyli javacsv.jar
i teraz w tym katalogu mam stworzyc katalog com/csvreader ?
czyli moj/csv/reader i tam wrzucić CSVTable. Ok
I jak to teraz skomplilować i później odpalić, czy z -cp czy bez
Robiłem to tak, że wyszedłem z katalogu w /moj zostawiłem .jar a w moj/com/csvreader zostawilem moja klase.
I teraz z poziomu moj/ kompiluje javac -cp ./:javacsv.jar CSVTable.java
I nie działa
- Rejestracja: dni
- Ostatnio: dni
jeżeli podpinałeś w NB biblioteki to uruchamiając z konsoli program musisz wskazać ich położenie. Robi taką magię przełącznik -cp lub -classpath
Reasumując odpalasz w taki sposób:
java -cp względna_ścieżka_do_jara com.csvreader.CSVTable
jeżeli odpalasz spakowany program do jara to dodajesz tylko przełącznik -jar. Reszta taka sama
java -cp względna_ścieżka_do_jara -jar com.csvreader.CSVTable
- Rejestracja: dni
- Ostatnio: dni
Odnośnie katalogów. Java ma to do siebie, że tak katalogi muszą mieć tą samą strukturę co katalogi. Tak więc bajtkod klasy pl.antoniossss.javax.mojaklasa musi być w pliku ./pl/antoniossss/javax/mojaklasa.class
Ta zasada działa w obie strony
- Rejestracja: dni
- Ostatnio: dni
ok, takie polecenie działa:
java -cp ./:javacsv-2.0.jar com.csvreader.CSVTable
Można to jakoś zrobić w linuksie żeby podawać tylko java nazwa_klasy (no i ewentualnie plik jako argument) ?
- Rejestracja: dni
- Ostatnio: dni
Jeżeli pracujesz na linuxie i nie wiesz tego - zalecam windowsa
nie znając linucha ni w ząb - skrypt bash?
Btw jak dla mnie cały temat powinien być przeniesiony do neewbee
- Rejestracja: dni
- Ostatnio: dni
lub jar oczywiscie
- Rejestracja: dni
- Ostatnio: dni
Dobra, mam nadzieję, że ostatnia sprawa i więcej nie będę Was męczył, chciałem wczytywać plik jako parametr więc zamiast linijki:
[code]
CSVTable = new CSVTable("input", X423423423423.csv);
[/code]
Dałem:
[code]
BufferedInputStream is = new BufferedInputStream(new FileInputStream(args[0]));
is.read();
System.out.print(is.read());
is.close();
[/code]
Czyta mi plik na jako parametr ale nie wypluwa pliku wynikowego znajdującego się w InsertData. Coś trzebba dodać w tym main jeszcze tylko nie wiem co.
- Rejestracja: dni
- Ostatnio: dni
Takie coś czyta mi plik jako parametr ale nic nie wypluwa
[code]
public static void main(String[] args) throws IOException, NullPointerException, NumberFormatException {
try {
BufferedInputStream is = new BufferedInputStream(new FileInputStream(args[0]));
//CSVTable frame = new CSVTable("input", "X004402141929004_1334824654152.csv");
} catch (NumberFormatException | NullPointerException | FileNotFoundException q) {
System.out.printf("plik" + args[0] + "nie istnieje");
System.exit(1);
}
}
}
[/code]
Trzeba dodać coś takiego jak StreamOutput i podać klase jaką ma uruchamić czy nie bardzo ?
- Rejestracja: dni
- Ostatnio: dni
A poprzednio podawałeś gdzie miał Ci wynik zapisywać?
No to w tym samym miejscu wstaw drugi argument....
- Rejestracja: dni
- Ostatnio: dni
Poprzednio w void insertData po prostu było to:
CsvWriter nowy = new CsvWriter(new FileWriter(outputFile, true), ';'); więc jak dodać następny argument.
- Rejestracja: dni
- Ostatnio: dni
No masz przecież outputFile nie ?
Czy mi się wydaje, czy Ty bezmyślnie kopiowałeś coś co wygrzebałeś w necie?
- Rejestracja: dni
- Ostatnio: dni
Polecam odwiedzenie strony SUN'a i rozpoczęcie wertowania javowych tutoriali odnośnie IO, sieci itd itp (POMIŃ GUI itp!)
- Rejestracja: dni
- Ostatnio: dni
No nie mam OutputFile. A co do kopiowanie to nie, pisałem sam ale to mój pierwszy program więc sklejałem po 1, 2 linijki z różnych źródeł to co przeczytałem w necie więc wyszedł śmieć jak cholera.
- Rejestracja: dni
- Ostatnio: dni
przecież to jest string.... a args to tablica stringów........ args[1] będzie drugim argumentem...... podaj tam ścieżkę do pliku wynikowego...
- Rejestracja: dni
- Ostatnio: dni
W sumie nie kumam dalej ale będę musiał poczytać i się tego nauczyć.... Dzięki wielkie jeszcze raz za poświęcony czas.
- Rejestracja: dni
- Ostatnio: dni
spodziewałem się tego
CsvWriter nowy = new CsvWriter(new FileWriter(args[1], true), ';'); więc jak dodać następny argument.
ucz się ucz....