Tablica dwuwymiarowa

0

Witajcie.
Stanąłem przed pewnym wyzwaniem. Otóż kwestia jest tego rodzaju że mam plik txt którego każdy wiersz jest taki sam, tzn ma taką samą długość. Potrzebuję z każdego wiersza wyciąć fragment od 1 znaku do 10, później od 15 do 20 i od 23 do 28. Czyli z każdego wiersza po 3 kawałki. Ilość wierszy w pliku jest mi nie znana czyli mogę dostać plik który zawiera 100 wierszy a może być taki który ma tych wierszy 1000. To akurat niewielki problem bo używam do tego metody substring. Problem pojawia się z tablicą ponieważ każdy element chcę wpisać do osobnego wiersza w tablicy. Deklaracja tablicy dwuwymiarowej w javie to

int[][] tab = new int [n][n]

gdzie w miejsce n wpisuje się ilość kolumn i wierszy. A jak rozwiązać problem gdy ilość wierszy jest mi nie znana? A może podsuniecie jakiś inny pomysł na rozwiązanie tego problemu. Powiem co chcę z tego później zrobić. Po wycięciu odpowiednich fragmentów z pliku zostanie odpalona funkcja SQLowa która utworzy mi tabelę w bazie, utworzy kolumny i wczyta mi te wycięte dane do tabeli tak że dane wycięte z pozycji 1 - 10 będą w jednej kolumnie, dane wycięte z pozycji 15 - 20 w drugiej kolumnie a dane wycięte z pozycji 23 - 28 w trzeciej kolumnie. Będę wdzięczny za każdą odpowiedź która pomoże mi w rozwiązaniu problemu :).
Pozdrawiam

0

Wczytuj po kolei każdy wiersz jako osobny string i zliczaj ile tego wczytało, będziesz znał liczbę wierszy...

0

Ok, jest to jakiś pomysł. Czyli jeszcze raz żebym dobrze zrozumiał. Mam wczytać każdy wiersz jako osobny string, zliczyć ich ilość a następnie utworzyć tablicę o konkretnej wielkości i na każdym utworzonym stringu wywołać metodę substring i wycinać fragmenty które mnie interesują i wczytywać je do tablicy?

1

Nie znasz liczby wierszy, ale znasz długość wiersza i znasz wielkość pliku.... może na tej podstawie dasz radę policzyć liczbę wierszy?
Inne spojrzenie - nie możesz zrobić jakiejś listy struktur, gdzie w strukturze będziesz miał te trzy pola, które będziesz wstawiał do bazy?
Jeszcze inaczej - nie możesz zrobić listy/tablicy gotowych, tworzonych na bieżąco podczas czytania pliku txt linia po lini stringów "INSERT INTO .. pole1 ... pole2 .. pole3"?
Jeszcze inaczej - nie możesz na bieżąco wypluwać takich sql-stringów do pliku txt, żeby potem odpalić go tylko jako zestaw poleceń sql?

1

Mniej więcej. W ogóle, zamiast tworzyć tablice, użyj lepiej kolekcji. Nie musisz definiować ich rozmiaru, są 'rozszerzane' automatycznie.

0

Zastanawiałem się nad rozwiązaniem które podsunął kolega fourfour a mianowicie żeby po każdym substringu zrobić wczytanie tego do bazy. Możesz coś więcej podrzucić? Rozumiem że uruchamiam funkcję tworzącą tablicę i 3 kolumny, następnie robię pętlę w której przelatuję po wierszach, wycinam z pierwszego interesujące mnie pozycję, uruchamiam funkcję robiącą mi INSERT'a, zwiększam iterator i lecę dalej po pliku aż do jego końca.

0

Możesz w ten sposób, wszystko zależy ile jest wierszy i jak często to będzie robione. Czasem lepiej skorzystać z jakiegoś mechanizmu wczytywania "wsadowego" (bulk copy), działa to po prostu szybciej i efektywniej (stąd pomysł by to zapisać jakoś do pliku jako zestaw danych do wczytania). Wciąż jednak podajesz za mało danych na temat tego, co faktycznie chcesz zrobić :)

0

Niestety mogę dostać plik który ma np 100 czy 1000 wierszy ale może mieć też 10 000 wierszy. Więcej na pewno nie. Maksymalny plik to 10 000 wierszy. Więc faktycznie, robienie inserta po każdym wierszu może zabić bazę. Mój plik wygląda tak że w każdym wierszu mam jakieś dane (jest to plik z raportem), stałopozycyjny czyli każda dana w każdym wierszu zaczyna i kończy się na tej samej pozycji. Ale do bazy nie potrzebuję wszystkiego bo generalnie plik zawiera aż 9 takich że tak to nazwę kolumn z danymi a ja w bazie potrzebuję tylko 3 dlatego bez sensu wczytywać całość jak mogę wyciąć tylko te które mnie interesują. I każdą chcę zapisać jak wyżej opisałem w odrębnej kolumnie. Teraz chcę znaleźć najbardziej optymalna metodę do wykonania tego.

Z tym że należy pamiętać że jedyną daną jaką znam to szerokość tej tablicy bo zawsze ma 3 kolumny natomiast długość (ilość wierszy) zależna jest od pliku z raportem i tego niestety nie znam. Zawsze jest inna.

0

A wiesz że wpadliśmy na to w tym samym czasie? Też teraz grzebiąc trafiłem właśnie na podobny problem na stackoverflow i tam też rada była jedna, lista struktur.

0

Dzięki wszystkim za pomoc. Problem rozwiązany. Zastosowałem listę a następnie później po elementach zrobiłem splita i wczytałem do bazy. Martwi mnie tylko jedna rzecz. Pomimo iż elementy listy są typu String i kolumny w tabeli w bazie typu VARCHAR to podczas wczytania danych do bazy jeśli przed daną wartością którą wczytuję są zera to mi je ucina. Załóżmy że mam wartość 00003615 to do bazy zapisuje mi tylko 3615. Ewidentnie dzieje się to po stronie bazy ponieważ jak wydrukowałem sobie konkretne wartości które przysyłam do SQL-a to te zera tam są. Myślicie że PostrgeSQL może mieć gdzieś w ustawieniach obcinanie zer z przodu? Nigdy się z czymś takim nie spotkałem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1