sczytywanie z pliku

0

hejka,
mam taki problem:
wczytuje sobie plik. w pliku tym sa jakies rozne dane. wczytania dokonuje w ten sposob:

try{

FileInputStream in = new FileInputStream("plik.txt");
BufferedReader d = new BufferedReader (

			new InputSteamReader(in));

while(true)
{
	String str = d.readLine();
		if( str == null)
			break;
}

catch(Exception exc)	{}

}

Problem moj jest nastepujacy:
w stringu str bede miala wszystkie linijki sczytane z pliku tekstowego. jak sobie wyrzuce system.out.println(str) to dostane wszystko po kolei. Ja wiem jednak ze kazda linijka zawiera 3 zmienne. Posiadam pozycje tych zmiennych (tzn pozycje od ktorej sie zaczyna w linijce) oraz ich dlugosc. Zmienne te potrzebuje wrzucic do jakis tablic bo potem beda mi potrzebne. Zastanawiam sie jak wczytac je (wiedzac w ktorym miejscu w linijce sie zaczynaja oraz znajac ich dlugosc i uwzgledniajac nowa linijke..). Czyli na koncu chcialabym dostac 3 tabilce:
tablica1 = zawiera zmienna1 z wszystkich linijek az do konca pliku
tablica2 = zawiera zmienna2 z wszystkich linijek az do konca pliku
tablica3 = zawiera zmienna3 z wszystkich linijek az do konca pliku

Mam nadz ze w miare zrozumiale opisalam moj problem..
czy ktos moglby mi cos zasugerowac?
pzdr,
misty

0

Po pierwsze nie tablice, bo słabo się skalują. Lepsze są listy. Po drugie jeżeli zmienne są oddzielone separatorem/znamy ich położenie w pliku to wystarczy napisać metodę która będzie nam odpowiednio kroiła tą linijkę i wrzucała do naszych list na przykład (dzielimy przecinkami):

public void readFile(File file){
   //....
   try{
      // ....
      if(str!=null){
          splitLine(str);
      }
      //.....
   }
   //...
}
public void splitLine(String line){
    String[] tmp = line.spilt(",");
    list1.add(tmp[0]);
    list2.add(tmp[1]);
    list3.add(tmp[2]);
}

Gdzie list1-3 to są jakieś listy, które przekazujesz readerowi w np. metodzie readFile i są później zwracane do zewnętrznego pliku - źródła danych.

0

tylko ze u mnie nie sa one podzielone ani przecinkiem, ani srednikiem, ani spacja. w sumie to jest jeden wielki ciag, ja po prostu wiem ze np. na pozycji 1szej, dlugosc 5 znakow =moja pierwsza zmienna; potem pozycja 6, dlugosc 3 znaki=druga zmienna. itd az do konca linii. a jak sie linia konczy, to to samo tylko w nastepnej linijce..

0

To uzywaj line.substring(0, 5), line substring(5, 8) itp aby wyluskac te dane.

0

a takie pytanie jeszcze mam-przykladowo przerobie kod KozioÅkana:

public void readFile(File file){
   //....
   try{
      // ....
      if(str!=null){
          splitLine(str);
      }
      //.....
   }
   //...
}
public void splitLine(String line){
    
List zmienna1 = new LinkedList();
List zmienna2 = new LinkedList();
//itd, ile zmiennych  

 zmienna1 = line.substring(pozycja_zmiennej1, dlugosc_zmiennej1);
zmienna2 = line.substring(pozycja_zmiennej2, dlugosc_zmiennej2);
  
}

tylko ze to mi sczyta z pierwszej linijki, tak? tzn wezmie pierwsza linie ze Stringa line i z niego odczyta sobie pozycje i dlugosc zmiennej1 i wpisze do niej, a pozniej zmiennej2 itd. ale co jak linia sie skonczy? jak ma przejsc do drugiej i wrzucac do list zmienna1,zmienna2 ich dalsze wartosci, nia kasujac tej z pierwszej pozycji?
mam nadz ze w miare jasno napisalam o co mi chodzi.

dzieki w ogóle za odpowiedzi,
pzdr

0

nie "sczytywanie" tylko "zczytywanie". poza tym to i tak powinno być "wczytywanie z pliku"

0

no niestety poprawnie jest jednak 'sczytywanie' a nie 'zczytywanie'. 'wczytywanie' zas kojarzy mi sie bardziej z 'do pliku'.

jesli zas chodzi dalej o watek tematu, to w miejscu:

zmienna1 = line.substring(pozycja_zmiennej1, dlugosc_zmiennej1);

krzyczy mi ze niekompatybilne typy.. tzn line jest Stringiem, zmienna1 jest typu LinkedList.. jak zatem dodac do LinkedList fragmenty tego Stringa?

0

dobra, juz doszlam do tego jak to zrobic:

LinkedList zmienna1 = new LinkedList();
zmienna1 = add(line.substring(3,6));

dzieki Wszystkim za pomoc i sugestie!
pzdr!

0

Tworzenie zmiennej poza metodą splitLine(). Inaczej w każdym obrocie pętli będziesz tworzyć nową listę i tym samym na zakończenie dostaniesz tylko ostatnią linijkę.

0

wypisalam sobie i faktycznie masz racje, poprawilam juz. dzieki!

0

a wlasciwie teraz jest cos nie tak-sczytywanie w ogóle nie chce sie skonczyc..

wyglada to mniej wiecej tak:

class Czytaj {

public LinkedList zmienna1 = new LinkedList();

public void DaneZPliku() 

{ try {
//wczytuje plik

 while (true)
{
        String str = d.readLine();
//wywolanie tej funkcji do podzielenia liniii
splitLine(str);
if(str == null)
break;
} 
d.cose();
}
catch(Exception ex) {}
}

public void splitLine(String linia)
{
       zmienna1.add(linia.substring(pozycja,dlugosc));
          System.out.println(zmienna1);
}
}//koniec klasy

no i wypisuje.. tylko ze nie moze przestac.. :/
normalnie jak zdefinuje zmienna1 w metodzie splitLine to fakt, dostane po 1 wartosci,ale przynajmniej konczy to wczytywanie. a teraz nie.
masz moze pomysl co moge miec nie tak?

0

OT
@misty napisała

no niestety poprawnie jest jednak 'sczytywanie' a nie 'zczytywanie'. 'wczytywanie' zas kojarzy mi sie bardziej z 'do pliku'.
Z pierwszą częścią się zgadzam, z drugą nie, 'do pliku' to można zapisywać. Sama zresztą piszesz (w pierwszym poście) o wczytywaniu pliku.

0

wczytywanie pliku ok. wczytywanie do czegos ok. wczytywanie z czegos-? troche dziwne. chyba sczytywanie/odczytywanie z czegos.

0

Test na nulla w petli zrob przed wykorzystaniem zmiennej line, moze to jest problemem.

0

no zrobilam. nie jest to null. zreszta widze jakie dane mi wypisuje-prawidlowe.. tylko nie moze skonczyc-moze jak dojedzie do konca pliku to zaczyna od nowa? tylko dlaczego?

0

zostawilam z czystej ciekawosci program uruchomiony i zobaczylam jak dlugo ta petla bedzie sie wykonywac. i wlasciwie to sie zakonczylo wykonywanie programu po prawie 6min.. dziwi mnie to bardzo, poniewaz wypisanie wszystkich linii z pliku zajmuje 47 sekund. a tutaj prawie 6min..
to chyba przez to ze w tym LiknedList tworzy sie strasznie duzo nowych linii (tyle ile jest w pliku) kazda jest dluzsza o jeden element. Jak zrobic by nie byly dopisywane nowe linie, a jedynie elementy?
przykladowo, po sczytaniu pierwszych 3ech liniku zmienna1 wyglada:
1
1 2
1 2 3

jak zrobic by dodawala tylko w wierszu a nie rowniez dodatkowa kolumne?

0

Podaj kod, dokładny, a nie mniej więcej. Ten który zamieściłaś pod hasłem mniej więcej nie ma prawa się skompilować:

d.cose();

Zrób wcięcia
</u>

0

kod:

class Czytaj { 
   
  public LinkedList zmienna1 = new LinkedList(); 
   
  public void DaneZPliku() 
   
  { try { 
  //wczytuje plik 
   
    FileInputStream in = new FileInputStream("plik.txt");     
   BufferedReader d = new BufferedReader( 
           new InputStreamReader(in));        
        

      while((str = d.readLine()) !=null)
      { 
         
  //wywolanie funkcji do podzielenia lini 
  splitLine(str); 
  if(str == null) 
  break; 
  } 
  d.cose(); 
  } 
  catch(Exception ex) {} 
  
  } 
   
  public void splitLine(String linia) 
  { 
         zmienna1.add(linia.substring(pozycja,dlugosc)); 
            System.out.println(zmienna1); 
  
  } 
  }//koniec klasy

i tak jak mowilam, wypisuje mi N wierszy( gdzie N to liczba wierszy w pliku).kazda linia ma dodana wartosc z nowej linii + wszystkie poprzednie. czyli przykladowo po 3ech pierwszych liniach dostane:
1
1 2
1 2 3
a ja chce jedna linie ze zmiennymi z wszystkich wierszy, czyli chce by moja lista zmienna1 zawierala:
1 2 3

podejrzeam ze problem tkwi w mijscu:

 public void splitLine(String linia) 
  { 
         zmienna1.add(linia.substring(pozycja,dlugosc)); 
            System.out.println(zmienna1); 
  
  }

tutaj za kazdy razem wypisuje zmienna1, dlatego dostaje co dostaje. nie wiem jednak jak zrobic by dostac wynik koncowy. czyli zawartosc listy zmianna1 jak juz sie zakonczy czytanie.
probowalam ciut przerobic:

class Czytaj { 
 
 public LinkedList zmienna1 = new LinkedList(); 
 
 public void DaneZPliku() 
 
 { try { 
 //wczytuje plik 
 
  while (true) 
 { 
         String str = d.readLine(); 
 //wywolanie funkcji do podzielenia lini 
 splitLine(str); 
 if(str == null) 
 break; 
 } 
 d.cose(); 
 } 
 catch(Exception ex) {} 
//tu dodalam
LinkedList zet = new LinkedList();
          zet = splitLine(str);
          System.out.println(zet);
 } 
 
 public LinkedList splitLine(String linia) 
 { 
        zmienna1.add(linia.substring(pozycja,dlugosc)); 
          
return zmienna1; 
 } 

czyli nie wypisuje juz zmiennna1 w funkcje LinkedList, tylko funkcja ta ma zwrocic zmienna1. i w funkcji DaneZPliku chce ja odczytac ale dostaje: Exception in thread "main" java.lang.NullPointerException

generalnie problem jest taki: jak dostac sie do listy zmienna1 (do tego co zawiera) po zakonczeniu sczytywania pliku?</url>

0

Kod nadal nie ma wcięć i nadal nie jest kompletny. Co to jest ?

d.cose();
0

sorki, d.close();
to jeszcze raz moj poprzedni post z wcieciami:

class Czytaj { 
   
public LinkedList zmienna1 = new LinkedList(); 
   
  public void DaneZPliku() 
   
    { try 
         { 
  //wczytuje plik 
   
    FileInputStream in = new FileInputStream("plik.txt");     
   BufferedReader d = new BufferedReader( 
           new InputStreamReader(in));        
        

             while((str = d.readLine()) !=null)
                { 
         
          //wywolanie funkcji do podzielenia lini 
            splitLine(str); 
            if(str == null) 
            break; 
                        } 
  d.close(); 
  } 
         catch(Exception ex) {} 
  
  } 
   
         public void splitLine(String linia) 
           { 
          zmienna1.add(linia.substring(pozycja,dlugosc)); 
            System.out.println(zmienna1); 
  
        } 
         }//koniec klasy

i tak jak mowilam, wypisuje mi N wierszy( gdzie N to liczba wierszy w pliku).kazda linia ma dodana wartosc z nowej linii + wszystkie poprzednie. czyli przykladowo po 3ech pierwszych liniach dostane:
1
1 2
1 2 3
a ja chce jedna linie ze zmiennymi z wszystkich wierszy, czyli chce by moja lista zmienna1 zawierala:
1 2 3

podejrzeam ze problem tkwi w mijscu:

 public void splitLine(String linia) 
  { 
         zmienna1.add(linia.substring(pozycja,dlugosc)); 
            System.out.println(zmienna1); 
  
  }

tutaj za kazdy razem wypisuje zmienna1, dlatego dostaje co dostaje. nie wiem jednak jak zrobic by dostac wynik koncowy. czyli zawartosc listy zmianna1 jak juz sie zakonczy czytanie.
probowalam ciut przerobic:

 
class Czytaj { 
 
 public LinkedList zmienna1 = new LinkedList(); 
 
   public void DaneZPliku() 
 
          { try
   { 
          //wczytuje plik 
   
     FileInputStream in = new FileInputStream("plik.txt");     
     BufferedReader d = new BufferedReader( 
           new InputStreamReader(in));        
        

             while((str = d.readLine()) !=null)
                { 
         
          //wywolanie funkcji do podzielenia lini 
            splitLine(str); 
            if(str == null) 
            break;  
      
              } 
   d.close(); 
      } 
 catch(Exception ex) {} 
                   //tu dodalam
                   LinkedList zet = new LinkedList();
                   zet = splitLine(str);
                   System.out.println(zet);
 } 
 
        public LinkedList splitLine(String linia) 
           { 
              zmienna1.add(linia.substring(pozycja,dlugosc)); 
          
              return zmienna1; 
 } 

 

czyli nie wypisuje juz zmiennna1 w funkcje LinkedList, tylko funkcja ta ma zwrocic zmienna1. i w funkcji DaneZPliku chce ja odczytac ale dostaje: Exception in thread "main" java.lang.NullPointerException

generalnie problem jest taki: jak dostac sie do listy zmienna1 (do tego co zawiera) po zakonczeniu sczytywania pliku?

0

Może tak:

class Czytaj 
{  
    public LinkedList zmienna1 = new LinkedList();   
    public void DaneZPliku()
    { 
         try
         {
              //wczytuje plik   
             FileInputStream in = new FileInputStream("plik.txt");     
             BufferedReader d = new BufferedReader(new InputStreamReader(in));            
             while((str = d.readLine()) !=null)
             {
                   zmienna1.add(str.substring(pozycja,dlugosc));
                   if(str == null)
                       break;
             }
             d.close();
         }
         catch(Exception ex) 
        {
             System.out.println(ex);
        } 
    }
    //wypisanie
    for (int i=0;i<zmienna1.size();i++)
    {
        System.out.println(zmienna1.get(i));
    } 
}//koniec klasy
0

super!
dziekuje bardzo za pomoc!

a jeszcze takie pytanie mam-jakbym chciala od razu wypisac calosc? tzn bo teraz on wypisuje po kazdej pozycji po kolei.
a ja bym chciala tak (i w sumie o to mi glownie chodzilo) by jak wypisze zmienna1 to bym dostala w jednym wierszu calosc.
tzn nie tak jak jest teraz, czyli:
1
2
3

tylko pisze Syste.out.println(zmienna1) i dostaje
1 2 3

rozumiesz o co mi chodzi?

0
    for (int i=0;i<zmienna1.size();i++)
    {
        System.out.print(zmienna1.get(i)+" ");
    } 
    // jeżeli po wypisaniu wszystkiego chcesz przejść do nowej linii, to jeszcze poniższy wiersz
    System.out.println("");

A jeśli chcesz koniecznie tak:

System.out.println(zmienna1) ;

to napisz własna klasę dziedziczącą z LinkedList i nadpisz w niej metodę toString()

public class MojaLista extends LinkedList
{
    public String toString()
    {
        ....
    }
}
0

wiem juz tez jak to zrobic moim poprzednim sposobem (czyli z funkcja splitLine):

   
public void DataKiala()  {
  String str = new String();
            
    try {
    
   // czytamy plik
   FileInputStream in = new FileInputStream("plik.txt");     
   BufferedReader d = new BufferedReader( 
   new InputStreamReader(in));        
        

      while((str = d.readLine()) !=null)
      { 
        splitLine(str); 
                 }
    
     d.close();
    System.out.println(zmienna1);
    }
          catch(Exception exc){ }
    
    }

        public  LinkedList splitLine(String linia)
            {   
          zmienna1.add(linia.substring(position, size)); 
          return zmienna1;
                }

     

tez dziala jak powinno:)
jeszcze raz dzieki wielkie za pomoc i cierpliwosc!

   pzdr,
            misty

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