2014-12-03 123 views
2

好吧,所以我想从文件中读取东西。他们是这样的:试图解析int字符串的输入字符串int int

70   Fresno Credit Bureau    Fresno   CA   93714 

而且我希望它是碎片,用70去一个int,弗雷斯诺征信局和弗雷斯诺进入单独字符串,状态缩写成单独的字符,最后喂最后一个邮政编码到另一个int。

我试图用扫描仪零碎地阅读它,我试图以批处理方式阅读它作为字符串缓冲区和任何方式没有骰子。

while(gre.hasNextLine()){ 
      imidate = gre.nextInt(); 
      gre.skip(" "); 
      han = gre.next(); 
      gre.skip(" "); 
      luke = gre.next(); 
      gre.skip(" "); 
      bok = gre.next().charAt(0); 
      mander = gre.next().charAt(1); 
      gre.skip(" "); 
      imate = gre.nextInt(); 
      theTree.addNode(imate, han, luke, bok, mander, imidate); 
     } 

这可能是在解析某个地方,从它的外观搞砸了,但我不知道在哪里。有什么建议么?注释?关注?

+0

这些标签,或者这是一个具有特定字段数的字段的文件? Java是否有一个字符串拆分,它将在选项卡上分割并创建一个数组,就像C#一样? – Nikki9696 2014-12-03 22:23:21

+0

@ Nikki9696是的Nikki,有一个java字符串拆分。你只需要传入某种字符串来寻找分割。 – CBredlow 2014-12-03 22:26:14

+0

请勿使用扫描仪。一次读一行,并根据字符位置或制表符或任何其他分隔列。 – 2014-12-03 22:32:20

回答

1

它看起来像你想让你的字符串内部有空格,把2+空格当作分隔符。对于工作,你需要设置Scanner的分隔符相应的模式:

Scanner gre = ... 
gre.useDelimiter("\\s{2,}"); 

现在调用next会忽略空格内Fresno Credit Bureau,只在两个或两个以上的空间突破。

因为Scanner会跳过分隔符,所以这样可以让您摆脱skip调用。

Demo.

最后,这段代码看起来可疑:

bok = gre.next().charAt(0); 
mander = gre.next().charAt(1); 

如果你试图抓住同样的第一和第二个字符,称charAt()之前将其存储在String。否则,你会被访问两个不同的令牌字符:

String tok = gre.next(); 
bok = tok.charAt(0); 
mander = tok.charAt(1); 
0

分割线为String [],那么你可以把字符串数组的元素到您的变量。

像:

String[] line = gre.split("\\s+"); 
imidate = Integer.parseInt(line[0]); 
han = line[1]; 
etc ... 
0

由于每一行由不同类型的对象,你应该有一个类来处理这个问题。例如,

class MyObject { 
    int number; 
    String name; 
    String city; 
    char[] state; 
    int zip; 

    public static MyObject fromLine(String line) { 
     String[] columns = line.split("\\s{2,}"); 
     number = Integer.parseInt(columns[0]); 
     name = columns[1]; 
     city = columns[2]; 
     state = columns[3].toCharArray(); 
     zip = Integer.parseInt(columns[4]); 
    } 
} 

如果你的文件中的每一行看起来像一个在你的问题,你可以通过阅读使用扫描仪或一个BufferedReader行的文件行,然后单独处理每一行的处理。使用一个BufferedReader,你可以做到以下几点:

try (BufferedReader reader = new BufferedReader(new FileReader(vocabulary))) { 
     List<MyObject> myObjects = reader.lines() 
             .map(MyObject::fromLine) 
             .collect(Collectors.toList()); 
} catch (IOException e) { } 

如果您正在使用的标签,然后用"\\t+"代替"\\s{2,}"