Foros del Web » Programación para mayores de 30 ;) » Java »

leer archivo por campos

Estas en el tema de leer archivo por campos en el foro de Java en Foros del Web. Hola, estoy trabajando con ficheros y me he econtrado con una duda que no consigo resolver. resulta que yo quiero leer ficheros, que estarian de ...
  #1 (permalink)  
Antiguo 07/05/2011, 04:56
 
Fecha de Ingreso: abril-2011
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
leer archivo por campos

Hola,

estoy trabajando con ficheros y me he econtrado con una duda que no consigo resolver. resulta que yo quiero leer ficheros, que estarian de la siguiente manera:

Hola,adios,ciao (al final de cada linea he puesto un espacio)
mañana,tarde,noche
azul,blanco,negro

entonces quiero leer campo a campo y si encuentro el nombre que busco, guardarme en un variable esa linea entera. eso lo hago con este codigo:


public class Ficheros{
public static void main(String[] args) {
File f = new File("fichero.txt");
Scanner s;
int d;
try {
s = new Scanner(f);
do{
String linea = s.nextLine();
Scanner sl = new Scanner(linea);
Scanner s2 = new Scanner(linea);
sl.useDelimiter("\\s*,\\s*");
s2.useDelimiter("\\s* \\s*");
String padre="blanco";
String e=s2.next();

String a=sl.next();
String b=sl.next();
d = padre.compareTo(b);
String c=sl.next();

if(d==0){
//guarda esa linea
System.out.println("padre encontrado");
System.out.println("la linea es: "+e);
System.out.println("a es "+a);
System.out.println("b es "+b);
System.out.println("c es "+c);
}
System.out.println(" ");
}while (s.hasNextLine());
s.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}



La duda viene cuando quiero hacer lo mismo, pero no sabiendo cuantos campos hay en cada linea. Tendre lineas con dos campos, y tendre lineas con 20. He pensado en un while cuya condicion de parada sea que encuentre el espacio, y entonces pase a la siguiente linea y empiece de nuevo con la linea nueva, pero no se como expresar esa condicion de parada. Tampoco estoy segura de que esto funcionara. Alguna idea?? Gracias
  #2 (permalink)  
Antiguo 07/05/2011, 05:32
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: leer archivo por campos

No veo tu problema. Con nextLine obtienes el fichero línea a línea.

Luego puedes utilizar el bucle que indicas o la función split, de la que te doy un ejemplo:

Código:
do{
String linea = s.nextLine();
String[] campos = linea.split(",");

for(String campo : campos)
 //hago lo que quiero recorriendo los campos
}while (s.hasNextLine());
  #3 (permalink)  
Antiguo 07/05/2011, 09:36
 
Fecha de Ingreso: abril-2011
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: leer archivo por campos

ummmmm... creo que mi nivel de java esta peor de lo que me tenia, lo siento, pero no entiendo muy bien tu codigo. Mi nivel de java es bajo.


Me intento explicar mejor. Yo quieor hacer lo mismo que hago con mi codigo de arriba, pero cuando no se el numero de elementos que voy a tener en cada linea. He mirado la funcion split, y creo entender que esta función lo q hace es crear un array de Strings metiendo los campos dentro, esto es asi???
Si yo tengo en una linea de mi fichero:

azul,blanco,negro,rojo,azul
se me creara un array de tamaño 5, por lo tanto campo[2]=negro????

es que no se si es q lo he hecho mal, pero cuando intento hacer eso, modificando mi codigo con lo que me has dicho, me sale q no puedo hacer campos[i].

Que estoy haciendo mal?
  #4 (permalink)  
Antiguo 07/05/2011, 09:57
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: leer archivo por campos

Pues sí, split crea un array de string y deberías poder hacer campos[i].

Pon el código completo a ver que tienes hecho.
  #5 (permalink)  
Antiguo 07/05/2011, 10:15
 
Fecha de Ingreso: abril-2011
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: leer archivo por campos

Lo siento, si que he conseguido meter campos[i], error mio, lo siento.

Aun asi, no hace exactamente lo que quiero. porque en campos[] se queda guardada la ultima linea, y no la que coincide con el valor que yo le marco. Como yo al final lo que quiero es quedarme con el array de la linea que coincide con mi variable "padre", habia pensado copiar esa tabla a otra llamada copia, para que se me quedaran ahi guardados los valores que yo quiero. pero tampoco me va bien :( te paso el codigo:



import java.io.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;



public class Ficheros {
public static void main(String[] args) {
File f = new File("fichero.txt");
Scanner s;
int d;

try {
s = new Scanner(f);
do{
String linea = s.nextLine();

Scanner sl = new Scanner(linea);
Scanner s2 = new Scanner(linea);
sl.useDelimiter("\\s*,\\s*");
s2.useDelimiter("\\s* \\s*");
String padre="blanco";
String e=s2.next();

String a=sl.next();
String b=sl.next();
d = padre.compareTo(b);
String c=sl.next();

String []campos = linea.split(",");
String []copia = new String[campos.length];
for(int i =0;i<campos.length;i++){
//System.out.println("los campos son "+campos[i]);
if(d==0){
//guarda esa linea
System.out.println("padre encontrado");
System.out.println("la linea es: "+e);
for(int j=0;j<campos.length;j++){
copia[j]=campos[j];
}
//System.out.println("los campos son "+campos[i]);
//System.out.println("b es "+b);
//System.out.println("c es "+c);
}

System.out.println(" ");
}
for(int k =0;k<campos.length;k++){
System.out.println("los campos de copia son "+copia[k]);
}




}while (s.hasNextLine());
s.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}




Muchisimas gracias
  #6 (permalink)  
Antiguo 07/05/2011, 15:36
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: leer archivo por campos

No veo la necesidad de un array adicional.

Sólo tienes que ir comprobando en cada iteración del bucle si se cumple la condición que buscas y si es así sales del bucle.

Sigues poniendo los Scanner s1 y s2. No entiendo para que los necesitas teniendo la función split que te he indicado.

Código C:
Ver original
  1. package pruebafichero;
  2.  
  3. import java.io.File;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileReader;
  6. import java.util.Scanner;
  7.  
  8.  
  9.  
  10. public class Ficheros {
  11. public static void main(String[] args) {
  12.  
  13. Scanner s;
  14. int d;
  15.  
  16. try {
  17. File f = new File("C:\\fichero.txt");
  18. s = new Scanner(f);
  19. boolean salir=false;
  20. while (s.hasNextLine() && !salir){
  21.    
  22. String linea = s.nextLine();
  23. String padre="blanco";
  24. //String e=s2.next();
  25.  
  26. //String a=sl.next();
  27. //String b=sl.next();
  28. //d = padre.compareTo(b);
  29. //String c=sl.next();
  30.  
  31. String []campos = linea.split(",");
  32. String a = campos[0];
  33. String b = campos[1];
  34. d = padre.compareTo(b);
  35. for(int i =0;i<campos.length;i++){
  36. //System.out.println("los campos son "+campos[i]);
  37. }
  38.  
  39. if(d==0){
  40. //guarda esa linea
  41. System.out.println("padre encontrado");
  42. System.out.println("la linea es: "+linea);
  43. salir=true;
  44. //System.out.println("los campos son "+campos[i]);
  45. //System.out.println("b es "+b);
  46. //System.out.println("c es "+c);
  47. }
  48. };
  49. s.close();
  50. } catch (FileNotFoundException e) {
  51. e.printStackTrace();
  52. }
  53. }  
  54. }
  #7 (permalink)  
Antiguo 08/05/2011, 02:57
 
Fecha de Ingreso: abril-2011
Mensajes: 10
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: leer archivo por campos

Muchas gracias, pero en tu codigo has supuesto que tengo solo dos campos en la linea, y yo realmente no voy a saber nunca cuantos campos tengo. Tambien he añadido lo de salir, pero no entiendo muy bien porque no va. Por ejemplo, en la 1ª linea puedo tener 2 campos, pero en la 2ª quizas tenga 20, en la 3ª 5campos, etc. Te copio el archivo con el que yo estoy haciendo las pruebas:

T,Pedro,luis,amigo
T,Juan,Dani
Felix,Antonio,pepe,lucia,ana,sonia,


Si ejecutas mi codigo veras que despues de terminar la ejecucion, lo que realmente se me queda guardado en copia es "felix,Antonio,pepe,lucia,ana,sonia", cuando lo que yo quiero que guarde en ese array es la linea que coincide ocn el nombre que busco. Como busco Juan, quiero que se me quede guardado en ese array "T,Juan,Dani".





Código:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Ficheros{
	public static void main (String args[]){
	
	
	File f;
	Scanner s;
	int d;
	String daddy;
	Boolean salir=false;
		
	f= new File("fichero.txt");
	daddy="Juan";

	try {
		s = new Scanner(f);
		do{
			String line= s.nextLine();
			String []fields = line.split(",");
			String []copy = new String[fields.length];
			for(int i =0;i<fields.length;i++){
				d = daddy.compareTo(fields[i]);
				if(d==0){
					//the proper line (la linea deseada)
					System.out.println("We find the father!!!!!!!!!");
					for(int j=0;j<fields.length;j++){
						copy[j]=fields[j];		
						System.out.println("The father is in the line: "+ copy[j]);
					}
					salir=true;
				}
				System.out.println(" ");
			}
			//array para imprimir por pantalla (solo para comprobar)
			for(int k =0;k<fields.length;k++){
				System.out.println("The copy's fields are "+copy[k]);
			}			
			}while (s.hasNextLine() && salir==false);
			s.close();
		} catch (FileNotFoundException e) {
		e.printStackTrace();	
		}
	}
}




Gracias
  #8 (permalink)  
Antiguo 08/05/2011, 14:47
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: leer archivo por campos

Puede ser que te fallase porque defines los arrays copia y fields dentro del bucle.

Tienes que declararlos fuera del bucle para que sigan existiendo al terminar este.

Código:
package palabras;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Ficheros{
	public static void main (String args[]){
	
	
	File f;
	Scanner s;
	int d;
	String daddy;
        String line;
        String []fields;
	Boolean salir=false;
		
	f= new File("C:/fichero.txt");
	daddy="Pedro";

	try {                
		s = new Scanner(f);
		do{
			line= s.nextLine();
			 fields= line.split(",");
			
			for(int i =0;i<fields.length;i++){
				d = daddy.compareTo(fields[i]);
				if(d==0){
					//the proper line (la linea deseada)
					System.out.println("We find the father!!!!!!!!!");					
					salir=true;
				}
				System.out.println(" ");
			}
			
						
			}while (s.hasNextLine() && salir==false);
			s.close();
		} catch (FileNotFoundException e) {
		e.printStackTrace();	
		}
	}
}
No había entendido que tu querías buscar la palabra en cualquier campo de la línea, yo pensaba que sólo era en el campo 2. Como ves no hace falta un array copia.

Etiquetas: campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:38.