Первая неделя обучения 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());
}
}
}
Заранее спасибо.
Похоже, это ваша домашняя работа по программированию, поэтому я не дам вам точного кодирования. Если ваш входной файл пуст, в противном случае ваш метод 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
Этот код хорош, так как он позволяет вам дополнительно обрабатывать извлечение данных, если это необходимо. Но он не имеет проверки на входном файле. Так что будь осторожен. Если вы считаете, что какой-либо ответ здесь полезен, отметьте его как ответ.
Обычно я делаю это, чтобы читать файл по строкам и выводить строки за строкой. Я уверен, что есть другие способы сделать это, просто экспериментируйте.
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());
}
The method println(String) is undefined for the type FileOutputStream
.