大家好我正在尝试从csv文件中读取字符串,int和double。这是我的csv文件中的一个示例:
World Development Indicators
Number of countries,252
CountryName,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012
Aruba,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.029310471,0,0,2.138784453,3.605985937,3.98141538,6.16435217,13.48254011,16.50927821,57.05427692,65.05605558,72.10431377,99.64250268,103.3849507,108.1325002,112.2180618,119.2038996,126.2103374,129.72824,0,131.8565401
Andorra,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.307211734,1.278625641,1.250259142,4.424155104,8.538444783,13.44671556,22.12730607,32.14530928,35.99902139,43.27794118,45.77115817,68.60251444,73.82494308,79.48487497,84.27763597,78.1171579,80.2836099,82.06181111,84.06818386,83.53432222,81.50204186
Afghanistan,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.112598381,0.865196277,2.498055472,4.826865367,9.833164022,17.71624331,29.22037376,37.89493697,45.77817474,60.32631999,60.35299258.
我需要将字符串读入名为String[] countryNames
的数组中,读取年份并将其存储到int[] yearLabels
中,最后将其存储为double[][] cellularDataTable
。
我为每个名为public String[] getCountryNames()
,public int[] getYearLabel()
和public data[][] getCellularDataTable()
的数组创建了一个函数。我创建了一个名为Class CSVReader
的类,这些方法都在我的班级中。在String数组函数中,我想跳过类的第一行并读取行Number of countries,252
并存储252作为字符串数组的大小并返回它或将每个国家存储到字符串数组中。我的算法错了,需要一些指导。年份函数仅用于读取年份,因此基本上可以获取年份中的国家和商店行,而double [] []函数读取国家和统计数据。因为我将数组传递给我的TestClass,如:
CSVReader parser = new CSVReader(FILENAME);
String [] countryNames = parser.getCountryNames();
int [] yearLabels = parser.getYearLabels();
double [][] parsedTable = parser.getCellularDataTable();
以下是我的CSVReader类文件:
import java.io.*;
import java.util.Scanner;
public class CSVReader {
String[] countryNames;
int[] yearNum;
double[][] tables;
Scanner scan;
public CSVReader(String filename)// throws FileNotFoundException
{
File file = new File(filename);
try
{
scan = new Scanner(file);
}
catch(FileNotFoundException e)
{
System.out.println(e.getMessage());
}
}
public String[] getCountryNames()
{
scan.nextLine();
while(scan.hasNext())
{
final String input = scan.nextLine();
String[] country = input.split(",");
//int a = Integer.parseInt(countryNames[1]);
System.out.println(country[0]);
int numberOfCountries = Integer.parseInt(country[1]);
}
scan.close();
}
public int[] getYearLabels()
{
}
public double[][] getParsedTable()
{
}
}
如果有人可以给我一些如何存储字符串的例子,int和double我相信我能理解。我想我的想法只是不知道如何实现代码。将欣赏帮助,我是编程新手。感谢
答案 0 :(得分:1)
从设计的角度来看,您应该进行一次文件读取并存储数据,以便以后快速访问。没有理由将解析分成许多位置;只需一次完成解析并将其存储在应该去的地方。
使用您当前的范例,您应该在构造函数中执行所有文件读取,这样一旦您开始使用您构建的对象,就已经读入了所有数据。
import java.io.*;
import java.util.Scanner;
public class CSVReader {
String[] countryNames;
int[] yearNum;
double[][] tables;
public CSVReader(String filename) throws FileNotFoundException{
File file = new File(filename);
Scanner scan = new Scanner(file);
scan.nextLine(); //Skip the header line
//Read the int on the next line to allocate arrays
String numLine = scan.nextLine();
final int n = Integer.parseInt(numLine.split(",")[1]); //Number is the string portion after the first comma
//Allocate arrays with length n
countryNames = new String[n];
tables = new double[n][];
//Read in the header line of years, parse and copy into yearNum
String[] yearHeaders = scan.nextLine().split(",");
final int m = yearHeaders.length - 1;
yearNum = new int[m];
for(int i = 0; i < m; i++){
yearNum[i] = Integer.parseInt(yearHeaders[i+1]); //i+1 to skip the first entry in the string arr
}
//Now read until we run out of lines - put the first in country names and the rest in the table
int c = 0;
while(scan.hasNext()){
String[] inputArr = scan.nextLine().split(",");
countryNames[c] = inputArr[0];
tables[c] = new double[m];
for(int i = 0; i < m; i++){
tables[c][i] = Double.parseDouble(inputArr[i+1]);
}
c++;
}
scan.close();
}
public String[] getCountryNames(){
return countryNames;
}
public int[] getYearLabels(){
return yearNum;
}
public double[][] getParsedTable(){
return tables;
}
}