我目前正在开发一个程序,该程序读入预设的文本文件,然后以各种方式处理数据。我已经使用数据操作来处理一些虚拟数据,但我仍然需要正确读取文本文件。
测试文件如下所示为120行:
阿伯丁,苏格兰,57,9,N,2,9-,W,5:00,P.M。阿德莱德,澳大利亚,34,55,S,138,36,E,2:30,A.M。阿尔及利亚阿尔及尔,36,50,N,3,0,E,6:00,下午(等等)
所以每个都需要按照String[] CityName
,String[] Country
,int[] LatDeg
,int[] LatMin
,String[] NorthSouth
,{{ 1}},int[] LongDeg
,int LongMin
,String[] EastWest
。int[] Time
所以问题在于,尽管我对缓冲读卡器感到相当舒服,但设计这个特定功能已经证明是困难的。事实上,过去几个小时我一直在画空白。看起来它需要多个循环和计数器,但我无法弄清楚究竟是如何。
答案 0 :(得分:2)
我假设每个行类型的文件结构都有一个城市。如果不是,则需要在以下解决方案中进行一些调整:
如果我对BufferReader更熟悉,我会按照以下方式进行:
List<List<String>> addresses = new ArrayList<List<String>>();
try(BufferedReader br = new BufferedReader(new FileReader(file))) {
for(String line; (line = br.readLine()) != null; ) {
addresses.add(line.split(","));
}
}
稍后,假设您想要检索“Adelaid”的国家/地区信息,您可以尝试以下操作:
for (List<String> cityInfo : addresses) {
if("Adelaid".equals(cityInfo.get(0)) {
country = cityInfo.get(1);
}
}
答案 1 :(得分:1)
尝试使用域对象,而不是创建不同的数组(如String [] CityName,String [] Country等)。
在这里,您可以拥有一个Domain对象或带有属性
的自定义类位置 public class Location
{
private String cityName;
private String country;
private String latDeg;
etc
getters();
setters();
}`
然后你可以写一个文件阅读器,文件中的每个行项目都是一个位置。所以结果会有
Location[] locations;
或 列出位置;`
答案 2 :(得分:-1)
将文件中的数据读入String变量,并使用String类的split()
方法将数据分解为单个值。 (如果文件中的数据用逗号分隔,请将逗号传递给split()
方法。
从split()
方法获得的值将是一个字符串数组。然后,您可以将数组值保存在相应的变量中。
CityName = array[0];
Country = array[1];
其中 array 是声明为String的数组变量。
请注意,如果需要对它们执行计算,则必须将数值更改为Integer.parseInt(String)
的整数。否则你可以将它们保留为字符串。
答案 3 :(得分:-1)
要执行此任务,我认为您要做的第一件事就是确定数据文件中实际存在多少行数据。你说它是120行,但如果它发生的话会更多或更少呢?我们想要确切地知道它是什么,以便正确初始化我们所有不同的数组。我们可以使用一种简单的方法来实现这一点,让我们将其称为 getFileLinesCount()方法,该方法将返回一个Integer值,该值将是数据文件保存的文本行数: / p>
private int getFileLinesCount(final String filePath) {
int lines = 0;
try{
File file =new File(filePath);
if(file.exists()){
FileReader fr = new FileReader(file);
try (LineNumberReader lnr = new LineNumberReader(fr)) {
while (lnr.readLine() != null){ lines++; }
}
}
else {
throw new IllegalArgumentException("GetFileLinesCount() Method Error!\n"
+ "The supplied file path does not exist!\n(" + filePath + ")");
}
}
catch(IOException e){ e.printStackTrace(); }
return lines;
}
将此方法放在主类中的某个位置。现在你需要声明并初始化你的所有数组:
String filePath = "C:\\My Files\\MyDataFile.txt";
int lines = getFileLinesCount(filePath);
String[] CityName = new String[lines];
String[] Country = new String[lines];
int[] LatDeg = new int[lines];
int[] LatMin = new int[lines];
String[] NorthSouth = new String[lines];
int[] LongDeg = new int[lines];
int[] LongMin = new int[lines];
String[] EastWest = new String[lines];
int[] Time = new int[lines];
String[] AMPM = new String[lines];
现在填写所有这些数组:
public static void main(String args[]) {
loadUpArrays();
// Do whatever you want to do
// with all those Arrays.....
}
private void loadUpArrays() {
// Read in the data file.
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String sCurrentLine;
int x = 0;
// Read in one line at a time and Fill the Arrays...
while ((sCurrentLine = br.readLine()) != null) {
// Split each line read into an array upon itself.
String[] fileLine = sCurrentLine.split(",");
// Fill our required Arrays...
CityName[x] = fileLine[0];
Country[x] = fileLine[1];
LatDeg[x] = Integer.parseInt(fileLine[2]);
LatMin[x] = Integer.parseInt(fileLine[3]);
NorthSouth[x] = fileLine[4];
LongDeg[x] = Integer.parseInt(fileLine[5]);
LongMin[x] = Integer.parseInt(fileLine[6]);
EastWest[x] = fileLine[7];
Time[x] = Integer.parseInt(fileLine[8]);
AMPM[x] = fileLine[9];
x++;
}
br.close();
}
catch (IOException ex) { ex.printStackTrace(); }
}
现在,我还没有对此进行测试,我只是快速打了一针,但我认为你可以开玩笑吧。
修改强>
由于 @Mad Physicist 在下面的评论中如此慷慨地指出,可以使用List来消除计算文件行的需要,因此无需两次读取数据文件。所有文件行都可以放入List中,有效文件行的数量可以通过List的大小来确定。现在也可以通过迭代List元素并相应地处理数据来实现所需数组的填充。一切都可以通过我们称之为 fillArrays()的单一方法来实现。你的Arrays声明会有所不同:
String[] CityName;
String[] Country;
int[] LatDeg;
int[] LatMin;
String[] NorthSouth;
int[] LongDeg;
int[] LongMin;
String[] EastWest;
String[] Time;
String[] AMPM;
public static void main(String args[]) {
fillArrays("C:\\My Files\\MyDataFile.txt");
// Whatever you want to do with all
// those Arrays...
}
private void fillArrays(final String filePath) {
List<String> fileLinesList = new ArrayList<>();
try{
File file = new File(filePath);
if(file.exists()){
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String strg;
while((strg = br.readLine()) != null){
// Make sure there is no blank line. If not
// then add line to List.
if (!strg.equals("")) { fileLinesList.add(strg); }
}
br.close();
}
}
else {
throw new IllegalArgumentException("GetFileLinesCount() Method Error!\n"
+ "The supplied file path does not exist!\n(" + filePath + ")");
}
// Initialize all the Arrays...
int lines = fileLinesList.size();
CityName = new String[lines];
Country = new String[lines];
LatDeg = new int[lines];
LatMin = new int[lines];
NorthSouth = new String[lines];
LongDeg = new int[lines];
LongMin = new int[lines];
EastWest = new String[lines];
Time = new String[lines];
AMPM = new String[lines];
// Fill all the Arrays...
for (int i = 0; i < fileLinesList.size(); i++) {
String[] lineArray = fileLinesList.get(i).split(",");
CityName[i] = lineArray[0];
Country[i] = lineArray[1];
LatDeg[i] = Integer.parseInt(lineArray[2]);
LatMin[i] = Integer.parseInt(lineArray[3]);
NorthSouth[i] = lineArray[4];
LongDeg[i] = Integer.parseInt(lineArray[5]);
LongMin[i] = Integer.parseInt(lineArray[6]);
EastWest[i] = lineArray[7];
Time[i] = lineArray[8];
AMPM[i] = lineArray[9];
}
}
catch(IOException e){ e.printStackTrace(); }
}
另一个注意事项......你的时间数组不能是整数,因为在数据中,时间包含冒号(:)这是一个字母字符(因为你没有注意到)我有将其声明更改为String []