Načtení souboru do pole – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Načtení souboru do pole – Java – Fórum – Programujte.comNačtení souboru do pole – Java – Fórum – Programujte.com

 

Jakub
~ Anonymní uživatel
905 příspěvků
30. 12. 2013   #1
-
0
-

Ahoj,

potřebuji dostat do dvojrozměrného pole soubor, políčka jsou v souboru odděleny znakem - například |, co řádek souboru, to řádek pole. Mám tu sesmolený nějaký kód, na rozeznání sloupců/řádků, ale nějak se mi to nedaří rozdělit do pole.

Můžete mi nějak poradit? Co dělám špatně? Jinak na Javu nejsem zrovna expert, tak prosím, případné rady v nějaké rozumné řeči :D.

Přikládám příkladový soubor a mnou sesmolený kód.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package semestralka;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

    
/**
 *
 * @author Jakub
 */

public class Main {

    int cols;
    int rows;
    String [] [] db = null;
    String soubor;
    char rozdelovac = '|';
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws FileNotFoundException {
        Scanner nacti = new Scanner(System.in);
        String soubor = "C:\\Users\\Jakub\\Desktop\\";
        InputStream fs = null; 
        // TODO code application logic here
        System.out.println("Zadej nazev souboru (.txt), ktery chcete nacist a potvrdte klavesou enter:");
        System.out.println("Jak ma soubor vypadat se docete v dokumentaci ...");
        System.out.print("Soubor: "); soubor += nacti.next();
        try { 
            fs = new FileInputStream(soubor); 
        } catch( FileNotFoundException e ) { 
            System.err.println("Soubor "+soubor+" nenalezen. Chyba: "+e); 
            System.exit(2); 
        }
        Main volac  = new Main(); // Zajištění volání nestatické metody ze statické
       for (int h = 0; h < volac.Napln(soubor).length; h++)
        { 
            for (int g = 0; g < volac.Napln(soubor).length; g++)
                System.out.print(volac.Napln(soubor)[h][g]);
            System.out.println("");
        } 
      /* System.out.print(volac.Napln(soubor)[0][0]); */

    }    
    public String[][] Napln (String soubor) throws FileNotFoundException
    {
        FileReader fr = new FileReader(soubor); 
               try { 
                       String radek;
                       BufferedReader in = new BufferedReader(fr); 
                       while ((radek = in.readLine()) != null) {
                               
                            int delka = radek.length();
                            char znak;
                            int col2 = 0;

                               for(int i=0; i<delka; i++) {
                                znak = radek.charAt(i);
                                if (znak == rozdelovac) {col2++;} 
                               }
                               if (col2 > cols) cols = col2;
                               col2 = 0;
                               rows++;
                        }
                       
                       db = new String [cols][rows];
                       FileReader fe = new FileReader(soubor);
                       BufferedReader im = new BufferedReader(fe); 
                       int pomrows = 0; int pomcols = 0; int poslpoz =0;
                       String radek2; 
                       while ((radek2 = im.readLine()) != null) {
                               for (int pozice = 0; pozice<radek2.length()-1; pozice++)
                               {
                                   if (radek2.charAt(pozice) == rozdelovac) //dodej rozdelovac
                                    {
                                        if (pozice == cols-1) {db[pomcols][pomrows] = radek2.substring(poslpoz)+" "; break; }
                                        else {
                                            db[pomcols][pomrows] = radek2.substring(poslpoz,pozice);
                                            poslpoz = pozice;
                                            pomcols++;
                                        }
                                   }                                                                  
                               }
                               pomrows++;
                       }
                fr.close();  } 
               catch (IOException e) { 
               System.out.println("Soubor nelze otevřít (Chyba: "+e+" )"); 
               }
        return db;
    
    }
}

 Soubor:

ID|Jmeno Prijmeni|Vek|Adresa
2|Jakub|92|Praha

Děkuji za případné rady!

Nahlásit jako SPAM
IP: 88.103.1.–
Kit+15
Guru
30. 12. 2013   #2
-
0
-

#1 Jakub
Podle vstupních dat spíš potřebuješ seznam jednorozměrných polí. Pro seznam se nejlépe hodí třída ArrayList, pro vytvoření jednorozměrného pole z řádku zase metoda String.split().

Nechce se mi to číst celé, mělo by se to tím zkrátit na cca 15-20 řádek.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jakub
~ Anonymní uživatel
905 příspěvků
30. 12. 2013   #3
-
0
-

#2 Kit
Budu s načteným souborem (.txt) pracovat jako s databází, takže kdyby chyběl záznam ve 'sloupci' (v souboru), tak se to blbě rozdělí, ne (Ne podle struktury, kterou potřebuji ...)?

Nahlásit jako SPAM
IP: 88.103.1.–
Kit+15
Guru
30. 12. 2013   #4
-
0
-

#3 Jakub 

String[] zaznam = radek.split(rozdelovac);
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jakub
~ Anonymní uživatel
905 příspěvků
30. 12. 2013   #5
-
0
-

 Jsem nějak pořád mimo :(

            FileReader fr = new FileReader(soubor); 
            ArrayList ListPole = new ArrayList<>();
               try {
                   String radek;
                       BufferedReader in = new BufferedReader(fr); 
                       while ((radek = in.readLine()) != null) {
                           
                            String[] zaznam = radek.split("|"); int posledni = 0;
                            for(int m = 0; m < zaznam.length; m++){
                                if (zaznam[m] == "|"){
                                    String pridat = null;
                                        for(int e = 0; e < m-posledni; e++) 
                                            pridat += zaznam[e];
                                        posledni = m;
                                    ListPole.add(pridat);}
                            }
                            ListPole.add(zaznam);
                        }
                   }
               catch(IOException e){
               
               }
Nahlásit jako SPAM
IP: 88.103.1.–
Kit+15
Guru
31. 12. 2013   #6
-
0
-

#5 Jakub
Proč to vypadá jako od Majakovského? Nechej to editorem zarovnat, než to sem dáš. S takovým bezdůvodným odsazováním se to blbě čte.

Ty dva vnitřní cykly jsou zbytečné. Pryč s nimi.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Jakub
~ Anonymní uživatel
905 příspěvků
31. 12. 2013   #7
-
0
-

Smolím to sám od sebe, takhle mi to vyhazujou NetBeansy, nechápu.

Už se mi to podařilo skoro dát dohromady, je nevím, proč se mi do ArrayListu ukládají všechny řádky do jednoho Arraylistu ... 

public ArrayList Napln (String soubor) throws FileNotFoundException
    {
            FileReader fr = new FileReader(soubor); 
            ArrayList ListPole = new ArrayList<>();
            ArrayList PolePole = new ArrayList<>();
            
            int pocetm = 0;
            
                 try {
                   String radek;
                       BufferedReader in = new BufferedReader(fr);
                       while ((radek = in.readLine()) != null) {
                           pocetm++;
                            String pridat = "";
                            int posledni = 0;
                            String[] zaznam = radek.split("|");
                            for(int m = 0; m < zaznam.length; m++){
                                if ("|".equals(zaznam[m]) && zaznam[m] != null){
                                    pridat = "";
                                        for(int e = posledni+1; e < m; e++) 
                                            pridat += zaznam[e];
                                    ListPole.add(pridat);
                                posledni = m;   
                                }
                                else if(zaznam.length-1 == m){
                                    pridat = "";
                                    for(int e = posledni; e < m; e++) 
                                            pridat += zaznam[e+1];
                                    ListPole.add(pridat);
                                }
                                
                            }
                            PolePole.add(ListPole);
                            //ListPole.clear();
                       }
                       
               }
               catch(IOException e){
                   System.out.println("Chyba - "+e);
               }
       return PolePole;     
    }

Děkuji!!

Nahlásit jako SPAM
IP: 88.103.1.–
sleepy
~ Anonymní uživatel
422 příspěvků
2. 1. 2014   #8
-
0
-

Popracuj na navykoch pri pisani v jave. Takze predpokladam ze chces urobit nieco taketo: Mas subor v ktorom mas meno stlpca a potom celu tabulku a potrebujes to sparsovat. No tak to skusme takto:

class Something{
	ArrayList<ArayList<String>> table = new ArrayList<>();

	public void loadFromFile(File f){
		// mozes overit ci file existuje a je mozne z neho citat
		BufferedReader br = null;
		try{
			
			br = new BufferedReader(new FileReader(f));
			String line = null;
			// ciklus v  ktorom citas file riadok po riadku
			while((line = br.readLine())!=null){
				// rozdelis podla regexu |
				String[] params = line.split("|");
// tu som to cele capol do noveho arraylistu a ten pridal do tabulky
				table.add(new ArrayList<String>(Arrays.asList(params)));
// ale ak su tam take veci ze ti to zacina | a konci | tak tam budes mat
// prvy a posledby string prazdny
// bude ich treba orezat
			}

		}
		catch(IOException ioe){
			ioe.printStackTrace(); // V buducnosti to budes
					//musiet minimalne zalogovat
		}
		finally{
			try {
				if (br != null)
					br.close();
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}

}

Avsak podla mna pre neskorsiu pracu je omnoho elegantnejsie celu tabulku ukladat do pola map, alebo mapy poli, neviem ktore z tych dvoch je menej pamatovo narocne. Pritom jednom by si si musel davat pozor aby si zbytocne negeneroval nove stringy. Ale pre male aplikacie je to uplne jedno. Inak ako tak pozeram ak sa snazis ten riadok spojit, resp nahradit "|" za "" a vlozit do listu, tak na to je prikaz replaceAll(Stirng regex, String replacement): table.add(line.replaceAll("|", " "); a table je typu ArrayList<String> potom.

Nahlásit jako SPAM
IP: 213.215.67.–
Kit+15
Guru
2. 1. 2014   #9
-
0
-

#8 sleepy

Když už píšeš o návycích psaní v Javě, tak na některé jsi zapomněl:

  • odsazování o 4 mezery
  • mezera před "{"
  • mezera za klíčovými slovy if, while, switch, catch finally
  • délka řádku max. 79 znaků

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
sleepy
~ Anonymní uživatel
422 příspěvků
3. 1. 2014   #10
-
0
-

Nezabudol, ja ich ignorujem. Okrem dlzky, tu mi eclipse vzdy oznaci. Ja som myslel skorej na sposob, ako pisat kod v jave. Omnoho dolezitejsie je spravne odsadzovanie kodu v blokoch spravne pomenovavanie a hlavne vyuzivanie vhodnich technik. Hlavne je aby kod bol lahko citatelny a lahko rozsiritelny (upravitelny). Kazdy niekedy zacina s javou. Po istej dobe vsak vzdy pride na to, ako spravne pisat kod, aj z dlhodobejsieho hladiska.

Nahlásit jako SPAM
IP: 213.215.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý