Как открыть и прочитать файл и записать конкретный контент в новый файл?

1

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

DESCRIPTION:
TITILE:
TYPE: image
SOURCE: Library
FORMAT: jpeg 
IDENTIFIER: 120034 
LATITUDE: 40.109580 
LONGITUDE: -88.228378 

DESCRIPTION: 
TITLE: GSLIS 
SUBJECT: 
TYPE: image 
SOURCE: Library 
FORMAT: jpeg 
IDENTIFIER: 120155 
LATITUDE: 40.107779 
LONGITUDE:-88.231621

Я просто написал два фрагмента кода: один для открытого и прочитанного, один для соответствия шаблонам:

package Functions;

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

public class readFileLocal {
    private static final String[] String = null;
    private String path;

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

    public String[] openFile() throws IOException{  
        FileReader freader = new FileReader (path);
        BufferedReader textReader = new BufferedReader (freader);

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

        int i;  
        for (i=0; i<numberOfLines; i++){

            String newLine=new String();
            newLine=null;
            textData[i] = textReader.readLine(); 
            String a = textData.toString();
            while ((textData[i])!=null){
                if (a.startsWith("Identifier: ") || a.startsWith("Latitude: ")||a.startsWith("Longitude:")){
                    newLine.append(a);
                }

                boolean filled1 =Boolean.valueOf(String newLine[0]);
                boolean filled2 =Boolean.valueOf(String newLine[1]);
                boolean filled3 =Boolean.valueOf(String newLine[2]);

                if(filled1, filled2, filled3) {
                       System.out.println(newLine[0]+'|'+newLine[1]+"|"+newLine[2]+"\n");
                }

                }
        }
    textReader.close();     
}


    int readLines() throws IOException{
        FileReader file_to_read = new FileReader(path);
        BufferedReader lines = new BufferedReader (file_to_read);

        String aLine=lines.readLine();
        int numberOfLines = 0;
        while(aLine != null) { 
            numberOfLines ++; 
        }  

        lines.close();
        return numberOfLines;
    }   

}

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

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ReadLatLong
{

    public ReadLatLong(){

       String line = "IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS IDENTIFIER: 115956 LATITUDE: 40.104730 LONGITUDE: -88.228798 DATE RIGHTS"; 
        String pattern = "IDENTIFIER:\\s(\\d*)\\sLATITUDE:\\s(\\d*\\.?\\d*)\\sLONGITUDE:\\s(.*?)\\s";

       Pattern r = Pattern.compile(pattern);
       Matcher m = r.matcher(line);

       while (m.find()) {
           System.out.println("Image: " + m.group(1)+"|"+m.group(2)+"|"+m.group(3));
       } 
   }
}

Теперь мне интересно, как искать весь файл, чтобы захватить все идентификаторы, широту, долготу и выложить их так: 120034 | 40.109580 | -88.228378 \n 120034 | 40.109580 | -88.228378 \n 120034 | 40.109580 | -88.228378 \n 120155 | 40.107779 | -88.231621 \n 120155 | 40.107779 | -88.231621 \n

Это мой основной метод, но я не знаю, как записать его в новый файл.

package readText;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class FileData {

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

        String file_path1 = "F:\\CampusImages.txt";
        String file_path2 = "F:\\CampusImageIDs.txt";

        try{
            ReadFileLocal file = new ReadFileLocal(file_path1);
            WriteFile writeout = new WriteFile( file_path2); //Don't know how to write it in new file.
            PrintWriter writer = new PrintWriter(new FileWriter(new File(file_path2)));
            String[] arylines = file.openFile();
            writeout.WriteToFile(String.valueOf(arylines));

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

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

Заранее спасибо.

Теги:
read-write

2 ответа

0
Лучший ответ

Похоже, это ваша домашняя работа по программированию, поэтому я не дам вам точного кодирования. Если ваш входной файл пуст, в противном случае ваш метод readLines() будет зацикливаться навсегда. если это не является обязательным, вам не нужно считать нет. строк перед чтением каждого из них. Вот что вы можете сделать:

read one line from the file
while the line is not null
    check if the line begins with one of the three identifier you want
    if so, append the line to a string
    if not, do nothing
    if the accumulated string has all three required line, use 'ReadLatLong' to do an output
    (simplest way is to use 3 bool flags)
    read another line using the same variable name as at the beginning
end while

Надеюсь это поможет.

EDIT: Хорошо, так как RoverMAX дал свое кодирование, я даю вам еще одну версию для вас.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestCampusImages {

    static final String file_path1 = "CampusImages.txt";
    static final String file_path2 = "CampusImageIDs.txt";
    static final Pattern pID = Pattern.compile("(?<=IDENTIFIER:)[\\d\\s]*");
    static final Pattern pLAT = Pattern.compile("(?<=LATITUDE:)[\\d\\s-.]*");
    static final Pattern pLONG = Pattern.compile("(?<=LONGITUDE:)[\\d\\s-.]*");

    public static void main(String[] args) {
        int id = 0;
        float latitude = 0.0f, longitude = 0.0f;
        try {
            File inFile = new File(file_path1);
            BufferedReader textReader = new BufferedReader(new FileReader(inFile));
            File outFile = new File(file_path2);
            PrintWriter out = new PrintWriter(outFile);
            String inLine = textReader.readLine();
            while (inLine != null) {
                Matcher m = pID.matcher(inLine);
                if (m.find()) {
                    id = Integer.parseInt(m.group().trim());
                }
                m = pLAT.matcher(inLine);
                if (m.find()) {
                    latitude = Float.parseFloat(m.group().trim());
                }
                m = pLONG.matcher(inLine);
                if (m.find()) {
                    longitude = Float.parseFloat(m.group().trim());
                }
                if ((id!=0) && (latitude!=0.0f) && (longitude!=0.0f)) {
                    out.println(String.format("%d | %f | %f ", id,  latitude, longitude));
                    id = 0;
                    latitude = 0.0f; longitude = 0.0f;
                }//end if
                inLine = textReader.readLine();
            }//end while
            textReader.close();
            out.close();
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }//end try
    } //end main

} //end TestCampusImages

Этот код хорош, так как он позволяет вам дополнительно обрабатывать извлечение данных, если это необходимо. Но он не имеет проверки на входном файле. Так что будь осторожен. Если вы считаете, что какой-либо ответ здесь полезен, отметьте его как ответ.

  • 0
    Нет, это не моя домашняя работа. Это всего лишь один проект, который я пытаюсь сделать, и одновременно использую Java. Я выучил немного Python в школе, и это тот объектив, который я использую для понимания Java, но мой Python тоже довольно простой. :-P В любом случае, спасибо за подсказку.
  • 0
    Извините за неуместные формулировки, которые я использую. Невероятные вещи только что произошли в последнее время. Я вспомнил, что когда начинал работать с Java, я однажды просматривал каждое слово в примере кода, который другие отправляли мне с помощью javadoc. Если у вас есть время, вы можете поискать утверждения и их значения в javadoc. Это очень помогает в моем случае.
Показать ещё 6 комментариев
0

Обычно я делаю это, чтобы читать файл по строкам и выводить строки за строкой. Я уверен, что есть другие способы сделать это, просто экспериментируйте.

try {
    FileReader fr = new FileReader(yourfile);
    BufferedReader br = new BufferedReader(fr);
    FileOutputStream fout = new FileOutputStream (yourOutputFile);
    PrintStream ps = new PrintStream(fout);
    String line = br.readLine();
    while (line != null) {
        //Do something; 
        String writeContent = your_code_to_get_write_content(line);
        ps.println(writeContent);
        line = br.readLine();
    }
} catch (IOException e) {
    System.out.println(e.getMessage());
}
  • 0
    Я пробовал этот код, но всегда была ошибка для строки `fout.println (writeContent);` Сообщение об ошибке: The method println(String) is undefined for the type FileOutputStream .
  • 0
    должно быть ps.println

Ещё вопросы

Сообщество Overcoder
Наверх
Меню