Найдите определенную строку текстового файла (не по номеру строки) и сохраните ее как новую строку - PullRequest
1 голос
/ 13 августа 2011

Я пытаюсь прочитать текстовый файл в Java, используя классы FileReader и BufferedReader.После онлайн-урока я сделал два класса, один называется ReadFile, а другой FileData.Затем я попытался извлечь небольшую часть текстового файла (т.е. между строками «ENTITIES» и «ENDSEC»).Наконец, я хотел бы сказать программе найти определенную строку между вышеупомянутыми и сохранить ее как Xvalue, которую я мог бы использовать позже.Я действительно изо всех сил пытаюсь выяснить, как сделать последнюю часть ... любая помощь будет очень оценена!

// FileData Class

    package textfiles;

    import java.io.IOException; 


    public class FileData {

public static void main (String[] args) throws IOException {

    String file_name = "C:/Point.txt";

    try {

        ReadFile file = new ReadFile (file_name);
        String[] aryLines = file.OpenFile();

        int i;
        for ( i=0; i < aryLines.length; i++ ) {
        System.out.println( aryLines[ i ] ) ;
}

    }

    catch (IOException e) {
        System.out.println(e.getMessage() );
    }

 }

 }

// ReadFile Class

    package textfiles;

    import java.io.IOException;
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.lang.String;

    public class ReadFile {

private String path;

public ReadFile (String file_path) {
    path = file_path;
}

public String[] OpenFile() throws IOException {

    FileReader fr = new FileReader (path);
    BufferedReader textReader = new BufferedReader (fr); 

     int numberOfLines = readLines();
      String[] textData = new String[numberOfLines];
     String nextline = "";

     int i;
             // String Xvalue; 

    for (i=0; i < numberOfLines; i++) {
         String oneline = textReader.readLine();

         int j = 0;

         if (oneline.equals("ENTITIES")) {
             nextline = oneline;
             System.out.println(oneline);
             while (!nextline.equals("ENDSEC")) {
                 nextline = textReader.readLine();
                 textData[j] = nextline;

            //  xvalue = ..........

                 j = j + 1;
                 i = i+1;
             }
         }       
         //textData[i] = textReader.readLine();
     }

     textReader.close( );
     return textData;

}

int readLines() throws IOException {

    FileReader file_to_read = new FileReader (path);
    BufferedReader bf = new BufferedReader (file_to_read);

    String aLine;
    int numberOfLines = 0;

    while (( aLine = bf.readLine()) != null ) {
        numberOfLines ++;
    }

    bf.close ();

    return numberOfLines;

}

}

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Я не знаю, какую именно строку вы ищете, но вот несколько методов, которые вы можете использовать для выполнения такой операции:

private static String START_LINE = "ENTITIES";
private static String END_LINE = "ENDSEC";

public static List<String> getSpecificLines(Srting filename) throws IOException{
    List<String> specificLines = new LinkedList<String>();
    Scanner sc = null;
    try {
        boolean foundStartLine = false;
        boolean foundEndLine = false;
        sc = new Scanner(new BufferedReader(new FileReader(filename)));
        while (!foundEndLine && sc.hasNext()) {
            String line = sc.nextLine();
            foundStartLine = foundStartLine || line.equals(START_LINE);
            foundEndLine = foundEndLine || line.equals(END_LINE);
            if(foundStartLine && !foundEndLine){
                specificLines.add(line);
            }
        }
    } finally {
        if (sc != null) {
            sc.close();
        }
    }
    return specificLines;
}

public static String getSpecificLine(List<String> specificLines){
    for(String line : specificLines){
        if(isSpecific(line)){
            return line;
        }
    }
    return null;
}

public static boolean isSpecific(String line){
    // What makes the String special??
}
0 голосов
/ 13 августа 2011

Когда я правильно понял, вы хотите сохранить каждую строку между ENTITIES и ENDSEC ?

Если да, вы можете просто определить StringBuffer и добавьте все, что находится между ними, к ключевым словам.

// This could you would put outside the while loop
StringBuffer xValues = new StringBuffer();

// This would be in the while loop and you append all the lines in the buffer
xValues.append(nextline);

Если вы хотите сохранить более конкретные данные между ними к ключевым словам, то вам, вероятно, нужно работать с Регулярными выражениями идостаньте необходимые данные и поместите их в разработанную DataStructure (класс, который вы определили для себя).

И, кстати.Я думаю, вы могли бы намного проще прочитать файл с помощью следующего кода:

BufferedReader reader = new BufferedReader(new
InputStreamReader(this.getClass().getResourceAsStream(filename)));

try {
   while ((line = reader.readLine()) != null) {
     if(line.equals("ENTITIES") {
       ...
     }

} (IOException e) {
   System.out.println("IO Exception. Couldn't Read the file!");
}

Тогда вам не нужно сначала читать, сколько строк в файле.Вы только начинаете читать до конца :).

РЕДАКТИРОВАТЬ:

Я до сих пор не знаю, правильно ли я понимаю.Так что если ENTITIES POINT 10 1333.888 20 333.5555 ENDSEC - это одна строка, то вы можете работать с split ("") методом.

Позвольте мне объяснить на примере:

String line = "";
String[] parts = line.split(" ");
float xValue = parts[2]; // would store 10
float yValue = parts[3]; // would store 1333.888
float zValue = parts[4]; // would store 20
float ...    = parts[5]; // would store 333.5555

EDIT2:

Или каждая точка (x, y, ..) на другой строке?!

Итак, содержимое файлаэто выглядит так:

ENTITIES POINT 
10 
1333.888 // <-- you want this one as xValue 
20 
333.5555 // <-- and this one as yvalue?
ENDSEC

BufferedReader reader = new BufferedReader(new
InputStreamReader(this.getClass().getResourceAsStream(filename)));

try {
   while ((line = reader.readLine()) != null) {
     if(line.equals("ENTITIES") {

        // read next line
        line = reader.readLine();
        if(line.equals("10") {
         // read next line to get the value
         line = reader.readLine(); // read next line to get the value
         float xValue = Float.parseFloat(line);
        }

        line = reader.readLine();

        if(line.equals("20") {
           // read next line to get the value
           line = reader.readLine(); 
           float yValue = Float.parseFloaT(line);
        }
     }

} (IOException e) {
   System.out.println("IO Exception. Couldn't Read the file!");
}

Если у вас есть несколько ENTITIES в файле, вам нужно создать класс, в котором будут храниться xValue, yValue, или вы можете использовать класс Point .Затем вы должны создать ArrayList из этих точек и просто добавить их ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...