2014-10-19 69 views
-1

我所试图做的是阅读具有这种线如何读取文件中的int,text和double并将其存储到数组列表中?

232131231,随机名称的文本文件,23.3232

我只知道如何读它作为整个行的字符串。我不知道如何单独阅读。这是我的测试代码。

主要

public class JavaApplication9 
{ 
    int value1; 
    String value2; 
    double value3; 
    ArrayList<String> toBeSplit = new ArrayList(); 
    String[] split; 
    ArrayList <Inventory> productList = new ArrayList<>(); 

    public long ReadFile(String sfile) throws IOException 
      {  
       int x = 0; 
       File inFile = new File(sfile); 
       BufferedReader reader = new BufferedReader(new FileReader(inFile)); 
       String sline = null; 
       while ((sline=reader.readLine()) != null) 
        { 
         toBeSplit.add(x,sline); 
         x++; 
        } 
       reader.close(); 
       return inFile.length(); 
      } 

    public void splitString() 
    { 
     int a = 0; 
     while (a<toBeSplit.size()) 
     { 
      split = toBeSplit.get(a).split(",");    
      value1 = Integer.parseInt(split[0]); 
      value2 = split[1]; 
      value3 = Double.parseDouble(split[2]); 
      productList.add(new Inventory (value1,value2,value3)); 
      a++; 
     } 
    } 

    public void OutputLines() 
    { 
     for (Inventory e : productList) 
     { 
      System.out.println (e.getBarcode() +"\t"+ e.getName()+"\t"+ e.getPrice()); 
     } 
    } 

    public static void main(String[] args) 
    { 
     try 
     { 
      JavaApplication9 instance = new JavaApplication9(); 
      instance.ReadFile("Products (1).csv"); 
      instance.splitString(); 
      instance.OutputLines(); 
     } 
     catch (IOException e) 
     { 
      System.out.print ("Error"); 
     } 
    } 
} 

和我的Inventory类

public class Inventory 
{ 
    int barcode; 
    String name; 
    double price; 

    public Inventory (int bars,String pname,double prices) 
    { 
     barcode = bars; 
     name = pname; 
     price = prices; 
    } 

    public int getBarcode() 
    { 
     return barcode; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public double getPrice() 
    { 
     return price; 
    } 

} 

回答

0

使用split(String regex)来拆分字符串。 (关于split(),请参阅javadocs) 然后,您可以按照需要的方式单独解析每个值。

下面是使用你的数据为例:

String toBeSplit = "232131231, random name, 23.3232"; 
String[] split = toBeSplit.split(","); 
int value1 = Integer.parseint(split[0].trim()); 
String value2 = split[1].trim(); 
double value3 = Double.parseDouble(split[2].trim()); 

我用trim()(见javadocstrim())摆脱分裂后留下的空白的。

这里的另一种方式做到这一点不trim():(只需添加一个空格分割的正则表达式中)

String toBeSplit = "232131231, random name, 23.3232"; 
String[] split = toBeSplit.split(", "); 
int value1 = Integer.parseint(split[0]); 
String value2 = split[1]; 
double value3 = Double.parseDouble(split[2]); 
+0

嘿,我已经做了你所说的话。由于某些原因程序无法运行。 异常在线程 “主” java.lang.NumberFormatException:对于输入字符串: “01001010100011” \t在java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) \t在java.lang.Integer.parseInt(整数的.java:495) \t在java.lang.Integer.parseInt(Integer.java:527) \t在javaapplication9.JavaApplication9.splitString(JavaApplication9.java:36) \t在javaapplication9.JavaApplication9.main(JavaApplication9.java: 58) – 2014-10-19 03:21:40

+0

@ZJJTeoh一个整数的最大值是2,147,483,647。这是因为int只能存储32个字节。您试图存储数量远远大于2147483647的数字1001010100011(解析int时省略前导零)。尝试使用Long.parseLong(String)并将变量类型设置为long。多头是64位,并且可以存储多达9223372036854775807. – 2014-10-19 03:50:05

+0

是我想到了。非常感谢 – 2014-10-19 03:50:56

0

您可以使用split(String regex)这一点。
考虑一个简单的例子:

String mystr = "232131231, random name, 23.3232"; 
List<String> list = Arrays.asList(mystr.split(", ")); 
for(String str : list){ 
    System.out.println(str); 
} 


输出:

232131231 
random name 
23.3232 

如果你想获得列表为ArrayList特别,你可以使用ArrayList(Collection list)版本的ArrayList

ArrayList list = new ArrayList(Arrays.asList(mystr.split(", "))); 
相关问题