🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.java
12 messages
12 total messages Started by Jadalbert Wed, 19 Dec 2012 22:50
Odczyt s CSV
#153714
Author: Jadalbert
Date: Wed, 19 Dec 2012 22:50
30 lines
1744 bytes
Mam taki problem
Chciałbym odczytywać wierszami plik CSV generowany 
przez excela. taki rodzaj pliku wsadowego. W 
pierwszym wierszu są nazwy zmiennych, w kolejnych 
wartości. Żeby było śmieszniej
w pierwszym wierszu są same Stringi
w kolejnych wierszach i poszczególnych (stałych) 
kolumnach są Stringi, a w innych kolumnach double. 
Coś jak to:
nazwa; x; y; z; typ;
kula; 23.0; 34.1; 45.3; 1
walec; 12.7; 23.3; 45.3; 2

W pętli maja się odczytać poszczególne wiersze 
sparowane z nazwami z wiersza pierwszego. Czyli:
nazwa kula
x 23.0
...
nazwa walec
x 12.7
...

I teraz pytanie. Do czego to ładować skoro raz mam 
String, a raz double? Do jakiego obiektu, 
kontenera, listy, map?
może w ogóle to głupie rozwiązanie. Główna idea to 
plik wsadowy i ten excel,  w którym dane można 
łatwo przygotować. Program ma tylko liczyć na tych 
danych. Z samego excela nie chcę czytać.
Z góry dziękuję za pomoc i opinie.
Re: Odczyt s CSV
#153715
Author: TrzyLinie
Date: Thu, 20 Dec 2012 06:36
29 lines
2306 bytes
W dniu 2012-12-19 23:50, Jadalbert napisał(a):
> w pierwszym wierszu są same Stringi
> w kolejnych wierszach i poszczególnych (stałych) kolumnach są Stringi, a w innych kolumnach double. Coś jak to:
> nazwa; x; y; z; typ;
> kula; 23.0; 34.1; 45.3; 1
> walec; 12.7; 23.3; 45.3; 2

> I teraz pytanie. Do czego to ładować skoro raz mam String, a raz double? Do jakiego obiektu, kontenera, listy, map?

Przetwarzać liniami i wtedy po wczytaniu linię dzielić na całostki StringTokenizerem
(http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html) lub przetwarzać
po kolei i wtedy dzielić na całostki StreamTokenizerem
(http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html) albo Scannerem
(http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html).

Napisać klasę, coś jak:

class Bryła {
   private String nazwa;
   private double x,y,z;
   private int typ; // albo jakiś enum
   //...
}

i dane z linii pliku ładować do obiektów tej klasy. A kolekcja obiektów tej klasy taka,
jaka wynika z dalszych celów zabawy z tymi bryłami.

-- 
TrzyLinie
Re: Odczyt s CSV
#153716
Author: Jadalbert
Date: Thu, 20 Dec 2012 09:00
63 lines
3216 bytes
W dniu 2012-12-20 07:36, TrzyLinie pisze:
> W dniu 2012-12-19 23:50, Jadalbert napisał(a):
>> w pierwszym wierszu są same Stringi
>> w kolejnych wierszach i poszczególnych (stałych)
>> kolumnach są Stringi, a w innych kolumnach
>> double. Coś jak to:
>> nazwa; x; y; z; typ;
>> kula; 23.0; 34.1; 45.3; 1
>> walec; 12.7; 23.3; 45.3; 2
>
>> I teraz pytanie. Do czego to ładować skoro raz
>> mam String, a raz double? Do jakiego obiektu,
>> kontenera, listy, map?
>
> Przetwarzać liniami i wtedy po wczytaniu linię
> dzielić na całostki StringTokenizerem
> (http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html)
> lub przetwarzać
> po kolei i wtedy dzielić na całostki
> StreamTokenizerem
> (http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html)
> albo Scannerem
> (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html).
>
>
> Napisać klasę, coś jak:
>
> class Bryła {
>    private String nazwa;
>    private double x,y,z;
>    private int typ; // albo jakiś enum
>    //...
> }
>
> i dane z linii pliku ładować do obiektów tej
> klasy. A kolekcja obiektów tej klasy taka,
> jaka wynika z dalszych celów zabawy z tymi bryłami.
>
Dzięki za odpowiedź.
Co do odczytu z samego pliku linii i podziału za 
pomocą np. StringTokenizer to mam już zrobione i z 
tym nie ma problemu.
Natomiast co do klasy to właśnie chciałem tego 
uniknąć bo tych danych jest ok 40 (większy problem 
obliczeniowy niż liczenie brył - dałem tylko 
przykład). Stąd, mimo klasy, trzeba będzie żmudnie 
podstawiać x=10, y=12... n=123

Myślałem nad "tablicą" zawierającą informacje 
parami (dodatkowo takie coś by miało sens z 
jeszcze innych powodów - łatwe wyszukiwanie danych 
po nazwie):
t[0] = x=10
t[1] = y=12
...
t[n] = n=123

Oczywiście przykład abstrakcyjny.
Niemniej nie da się zadeklarować wprost typu 
danych takiej "tablicy" bo są to, raz pary String 
= String, a raz String = double.
Ale jak nic mi sensownego nie wpadnie do głowy to 
ww klasa jest jedynym wyjściem.
Re: Odczyt s CSV
#153717
Author: Tomek Kańka
Date: Thu, 20 Dec 2012 16:27
58 lines
2740 bytes
Jadalbert <maxorin@poczta.onet.pl> napisał(a)
> W dniu 2012-12-20 07:36, TrzyLinie pisze:
>> W dniu 2012-12-19 23:50, Jadalbert napisał(a):
>>> w pierwszym wierszu są same Stringi
>>> w kolejnych wierszach i poszczególnych (stałych)
>>> kolumnach są Stringi, a w innych kolumnach
>>> double. Coś jak to:
>>> nazwa; x; y; z; typ;
>>> kula; 23.0; 34.1; 45.3; 1
>>> walec; 12.7; 23.3; 45.3; 2
>>
>>> I teraz pytanie. Do czego to ładować skoro raz
>>> mam String, a raz double? Do jakiego obiektu,
>>> kontenera, listy, map?
>>
>> Przetwarzać liniami i wtedy po wczytaniu linię
>> dzielić na całostki StringTokenizerem
>> (http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html)
>> lub przetwarzać
>> po kolei i wtedy dzielić na całostki
>> StreamTokenizerem
>> (http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html)
>> albo Scannerem
>> (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html).
>>
>>
>> Napisać klasę, coś jak:
>>
>> class Bryła {
>>    private String nazwa;
>>    private double x,y,z;
>>    private int typ; // albo jakiś enum
>>    //...
>> }
>>
>> i dane z linii pliku ładować do obiektów tej
>> klasy. A kolekcja obiektów tej klasy taka,
>> jaka wynika z dalszych celów zabawy z tymi bryłami.
>>
> Dzięki za odpowiedź.
> Co do odczytu z samego pliku linii i podziału za 
> pomocą np. StringTokenizer to mam już zrobione i z 
> tym nie ma problemu.
> Natomiast co do klasy to właśnie chciałem tego 
> uniknąć bo tych danych jest ok 40 (większy problem 
> obliczeniowy niż liczenie brył - dałem tylko 
> przykład). Stąd, mimo klasy, trzeba będzie żmudnie 
> podstawiać x=10, y=12... n=123
>
>

No to ładuj do Map<String, Object>

Nic dobrego z tego nie wyniknie:), ale może akurat w Twoim przypadku
przejdzie.

-- 
Tomek
Re: Odczyt s CSV
#153718
Author: Jadalbert
Date: Thu, 20 Dec 2012 16:43
51 lines
2792 bytes
W dniu 2012-12-20 17:27, Tomek Kańka pisze:
> Jadalbert <maxorin@poczta.onet.pl> napisał(a)
..........
>>>
>>> Przetwarzać liniami i wtedy po wczytaniu linię
>>> dzielić na całostki StringTokenizerem
>>> (http://docs.oracle.com/javase/7/docs/api/java/util/StringTokenizer.html)
>>> lub przetwarzać
>>> po kolei i wtedy dzielić na całostki
>>> StreamTokenizerem
>>> (http://docs.oracle.com/javase/7/docs/api/java/io/StreamTokenizer.html)
>>> albo Scannerem
>>> (http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html).
>>>
>>>
>>> Napisać klasę, coś jak:
>>>
>>> class Bryła {
>>>     private String nazwa;
>>>     private double x,y,z;
>>>     private int typ; // albo jakiś enum
>>>     //...
>>> }
>>>
>>> i dane z linii pliku ładować do obiektów tej
>>> klasy. A kolekcja obiektów tej klasy taka,
>>> jaka wynika z dalszych celów zabawy z tymi bryłami.
>>>
>> Dzięki za odpowiedź.
>> Co do odczytu z samego pliku linii i podziału za
>> pomocą np. StringTokenizer to mam już zrobione i z
>> tym nie ma problemu.
>> Natomiast co do klasy to właśnie chciałem tego
>> uniknąć bo tych danych jest ok 40 (większy problem
>> obliczeniowy niż liczenie brył - dałem tylko
>> przykład). Stąd, mimo klasy, trzeba będzie żmudnie
>> podstawiać x=10, y=12... n=123
>>
>>
>
> No to ładuj do Map<String, Object>
>
> Nic dobrego z tego nie wyniknie:), ale może akurat w Twoim przypadku
> przejdzie.
>
Ok. Ale piszesz tak, bo map uważasz za zły pomysł 
w ogóle (oczywiście w tym wypadku)? Wg ciebie 
rozwiązanie z klasa jw jest odpowiednie? Pytam 
serio, bo ja mam małe doświadczenie w javie i nie 
wiem czy w ogóle się męczyć z wymyślaniem Bóg wie 
czego.
Re: Odczyt s CSV
#153719
Author: Tomek Kańka
Date: Thu, 20 Dec 2012 22:24
27 lines
1806 bytes
Jadalbert <maxorin@poczta.onet.pl> napisał(a)
>>
>> No to ładuj do Map<String, Object>
>>
>> Nic dobrego z tego nie wyniknie:), ale może akurat w Twoim przypadku
>> przejdzie.
>>
> Ok. Ale piszesz tak, bo map uważasz za zły pomysł 
> w ogóle (oczywiście w tym wypadku)? Wg ciebie 
> rozwiązanie z klasa jw jest odpowiednie? Pytam 
> serio, bo ja mam małe doświadczenie w javie i nie 
> wiem czy w ogóle się męczyć z wymyślaniem Bóg wie 
> czego.
>

Piszę tak, bo to zupełnie nie "obiektowe" podejście, do tego nie
type-safe, itd. Za to wyjątkowo elastyczne. Jeśli Twoim celem po
wczytaniu danych będzie wypisane tego w postaci 
nazwa=wartość 
możesz tak zrobić, ale jeśli chcesz potem np.

((int)map.get('ile')) * ((Double) map.get('wartosc'))) * ...

to sam widzisz, że nie powinieneś iść tą drogą.

-- 
Tomek
Re: Odczyt s CSV
#153720
Author: TrzyLinie
Date: Fri, 21 Dec 2012 06:45
34 lines
2614 bytes
W dniu 2012-12-20 23:24, Tomek Kańka napisał(a):
> Jadalbert <maxorin@poczta.onet.pl> napisał(a)
>>>
>>> No to ładuj do Map<String, Object>
>>>
>>> Nic dobrego z tego nie wyniknie:), ale może akurat w Twoim przypadku
>>> przejdzie.
>>>
>> Ok. Ale piszesz tak, bo map uważasz za zły pomysł
>> w ogóle (oczywiście w tym wypadku)? Wg ciebie
>> rozwiązanie z klasa jw jest odpowiednie? Pytam
>> serio, bo ja mam małe doświadczenie w javie i nie
>> wiem czy w ogóle się męczyć z wymyślaniem Bóg wie
>> czego.
>>
>
> Piszę tak, bo to zupełnie nie "obiektowe" podejście, do tego nie
> type-safe, itd. Za to wyjątkowo elastyczne. Jeśli Twoim celem po
> wczytaniu danych będzie wypisane tego w postaci
> nazwa=wartość
> możesz tak zrobić, ale jeśli chcesz potem np.
>
> ((int)map.get('ile')) * ((Double) map.get('wartosc'))) * ...
>
> to sam widzisz, że nie powinieneś iść tą drogą.

Zaproponuj, proszę, rozwiązanie, które będzie i obiektowe, i type-safe,
i pozwoli stwierdzić, że zaproponowaną drogą powinno się iść (nie musi
być "wyjątkowo elastyczne"). Chciałbym oprócz listy wad pierwszej
propozycji zobaczyć propozycję lepszą wg tych kryteriów. Ale może za
dużo chcę... ;)

-- 
TrzyLinie
Re: Odczyt s CSV
#153721
Author: czeslaw.szczotka
Date: Sun, 30 Dec 2012 17:52
4 lines
1781 bytes
Witam,
Kiedyś używałem do procesowania plików csv biblioteki java opencsv. Tam jest możliwość konwersji pojedyńczej lini w pliku do reprezentacji obiektowej java bean -a. 
http://opencsv.sourceforge.net/#javabean-integration
Pozd.
Re: Odczyt s CSV
#153722
Author: Jadalbert
Date: Thu, 03 Jan 2013 06:46
13 lines
1947 bytes
W dniu 2012-12-30 18:52, czeslaw.szczotka pisze:
> Witam,
> Kiedyś używałem do procesowania plików csv biblioteki java opencsv. Tam jest możliwość konwersji pojedyńczej lini w pliku do reprezentacji obiektowej java bean -a.
> http://opencsv.sourceforge.net/#javabean-integration
> Pozd.
>
Dzięki za radę. Obadam ten sposób. Na razie 
poradziłem sobie ładując wszystko po kolei do pól 
klasy z uwzględnieniem typu zmiennych zarówno w 
linii (pierwsza nagłówkowa String) i dla kolejnych 
linii w kolumnach (String, double, int). Jeśli się 
zachowuje reżim kolejności w csv i klasie, jest 
ok. Niestety nie jest to eleganckie rozwiązanie.
Re: Odczyt s CSV
#153723
Author: TrzyLinie
Date: Thu, 03 Jan 2013 10:15
12 lines
2095 bytes
W dniu 2013-01-03 07:46, Jadalbert napisał(a):
> Na razie poradziłem sobie ładując wszystko po kolei do pól klasy z uwzględnieniem typu zmiennych zarówno w linii (pierwsza nagłówkowa
> String) i dla kolejnych linii w kolumnach (String, double, int). Jeśli się zachowuje reżim kolejności w csv i klasie, jest ok. Niestety nie jest to eleganckie rozwiązanie.

Jejku, czego ja nie wiem, że uważam sposób z klasą za jak najbardziej elegancki?!? Co
masz do zarzucenia temu sposobowi?!?

I dlaczego uważasz, że trzeba zachowywać "reżim kolejności w csv i klasie"? Albo co masz
na myśli mówiąc o zachowywaniu "kolejności"? Kolejność czego?

-- 
TrzyLinie
Re: Odczyt s CSV
#153724
Author: Jadalbert
Date: Thu, 03 Jan 2013 11:18
45 lines
2958 bytes
W dniu 2013-01-03 11:15, TrzyLinie pisze:
> W dniu 2013-01-03 07:46, Jadalbert napisał(a):
>> Na razie poradziłem sobie ładując wszystko po
>> kolei do pól klasy z uwzględnieniem typu
>> zmiennych zarówno w linii (pierwsza nagłówkowa
>> String) i dla kolejnych linii w kolumnach
>> (String, double, int). Jeśli się zachowuje reżim
>> kolejności w csv i klasie, jest ok. Niestety nie
>> jest to eleganckie rozwiązanie.
>
> Jejku, czego ja nie wiem, że uważam sposób z klasą
> za jak najbardziej elegancki?!? Co
> masz do zarzucenia temu sposobowi?!?
No może za ostro się wypowiedziałem. Klasa jest 
ok. Nie eleganckość polega wg mnie tym (ale to 
problem mojego kodu, na razie), że trzeba żmudnie 
wpisywać dane do pól, a jest ich sporo. Ze względu 
na to, że te dane maja różne typy w obrębie 
wiersza konieczny jest reżim. Czyli jak mam w 
pliku i wierszu drugim:
walec, 100.0, 20.0, 1
to w klasie muszę czytać:
nazwa = walec (bo to String)
wysokosc = 100.00 (bo to double)
srednica = 20.0 (bo to double)
typ_bryly = 1 (bo to int)
itd.
Powyższe to jedynie przykład. Naprawdę jest tych 
danych więcej. Do tego są one tworzone w excelu i 
zapisywane jako cvs, więc i użytkownik w excelu 
się może pomylić i pisać "Stringa" w komórce 
"double". Oczywiście wiem, że i to można ogarnąć i 
to w końcu ogarnę. Ale umyśliłem sobie klasę typu
Cokolwiek {
nazwa String;
wartość cokolwiek;
}
Pomarzyć można.

>
> I dlaczego uważasz, że trzeba zachowywać "reżim
> kolejności w csv i klasie"? Albo co masz
> na myśli mówiąc o zachowywaniu "kolejności"?
> Kolejność czego?
>
Re: Odczyt s CSV
#153725
Author: TrzyLinie
Date: Thu, 03 Jan 2013 13:53
37 lines
3384 bytes
W dniu 2013-01-03 12:18, Jadalbert napisał(a):
> W dniu 2013-01-03 11:15, TrzyLinie pisze:
>> W dniu 2013-01-03 07:46, Jadalbert napisał(a):
>>> Na razie poradziłem sobie ładując wszystko po
>>> kolei do pól klasy z uwzględnieniem typu
>>> zmiennych zarówno w linii (pierwsza nagłówkowa
>>> String) i dla kolejnych linii w kolumnach
>>> (String, double, int). Jeśli się zachowuje reżim
>>> kolejności w csv i klasie, jest ok. Niestety nie
>>> jest to eleganckie rozwiązanie.
>>
>> Jejku, czego ja nie wiem, że uważam sposób z klasą
>> za jak najbardziej elegancki?!? Co
>> masz do zarzucenia temu sposobowi?!?
> No może za ostro się wypowiedziałem. Klasa jest ok. Nie eleganckość polega wg mnie tym (ale to problem mojego kodu, na razie), że trzeba żmudnie wpisywać dane do pól, a
> jest ich sporo. Ze względu na to, że te dane maja różne typy w obrębie wiersza konieczny jest reżim. Czyli jak mam w pliku i wierszu drugim:
> walec, 100.0, 20.0, 1
> to w klasie muszę czytać:
> nazwa = walec (bo to String)
> wysokosc = 100.00 (bo to double)
> srednica = 20.0 (bo to double)
> typ_bryly = 1 (bo to int)
> itd.
> Powyższe to jedynie przykład. Naprawdę jest tych danych więcej. Do tego są one tworzone w excelu i zapisywane jako cvs, więc i użytkownik w excelu się może pomylić i pisać
> "Stringa" w komórce "double". Oczywiście wiem, że i to można ogarnąć i to w końcu ogarnę. Ale umyśliłem sobie klasę typu
> Cokolwiek {
> nazwa String;
> wartość cokolwiek;
> }

Już rozumiem co Ci się nie podoba, choć dalej nie rozumiem dlaczego ;) CSV to przecież
zwykły tekst, więc zawsze trzeba to po przeczytaniu sparsować do odpowiedniego typu...
Jeśli CSV to czytanie wg "reżimu" - może spróbować wycisnąć z Excela inny format niż CSV?
Np. http://jexcelapi.sourceforge.net/ wprost do odczytu XLS? :)

-- 
TrzyLinie
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads