【问题标题】:splitting string from text file : IndexOutOfBounds从文本文件中拆分字符串:IndexOutOfBounds
【发布时间】:2013-07-12 22:46:31
【问题描述】:

我有一个看起来像这样的文本文件:

Aaaaa      0.55     2
bbb        2.1      0.25
ccccc      71       21
.....      ...      ...
ZzZz       0.725    42.92
Total: 746.54

我正在尝试获取每一列并将其放在每列的 String[] 中。 readprod[] 将是第一列,readcant[] 第二列,readpret[] 第三列。

    String[] readprod;
String[] readcant;
String[] readpret;
int nrz;
int lineCount;
String[] columns;
nrz = 0;
            File root = android.os.Environment
                    .getExternalStorageDirectory();

            File dir = new File(root.getAbsolutePath() + "/.InterSRL");
            dir.mkdirs();
            final File file = new File(dir, str);

            try {
                BufferedReader br = new BufferedReader(new FileReader(file));
                String line;

                lineCount = 0;
                while ((line = br.readLine()) != null) {

                    lineCount++;
                }

            } catch (IOException e) {
                // You'll need to add proper error handling here
            }

            readprod = new String[lineCount];
            readpret = new String[lineCount];
            readcant = new String[lineCount];

            // Read text from file
            StringBuilder text = new StringBuilder();

            try {
                BufferedReader br = new BufferedReader(new FileReader(file));
                String line;

                while ((line = br.readLine()) != null) {
                    text.append(line);
                    text.append('\n');
                    columns = line.split("\\s+");
                    readprod[nrz] = columns[0];
                    readcant[nrz] = columns[1];
                    readpret[nrz] = columns[2];
                    nrz++;

                }

问题是我在readcant[nrz] = columns[1]; 得到java.lang.ArrayIndexOutOfBoundsException: length=1; index=1

有什么问题?有没有更好的方法从文本文件中读取列并将它们放在每列的不同字符串或数组列表中?

另外:当它们之间有超过 3 个空格时,有没有办法分割它们?我刚刚意识到第一列,带有名称的列可以有一个值,例如,Fish Sticks 200g..damn...

编辑:我这样做了:

columns = line.split("\\s+");
readprod[nrz] = columns[0];
Log.d("Listener", "Columns[0]= "+columns[0]);
readcant[nrz] = columns[1];
Log.d("Listener", "Columns[1]= "+columns[1]);
readpret[nrz] = columns[2];
Log.d("Listener", "Columns[2]= "+columns[2]);
nrz++;

这就是我得到的:

07-13 01:55:43.570: D/Listener(15805): Columns[0]= Bulion
07-13 01:55:43.570: D/Listener(15805): Columns[1]= 1
07-13 01:55:43.570: D/Listener(15805): Columns[2]= 2.25
07-13 01:55:43.570: D/Listener(15805): Columns[0]= 
07-13 01:55:43.570: D/AndroidRuntime(15805): Shutting down VM
07-13 01:55:43.570: W/dalvikvm(15805): threadid=1: thread exiting with uncaught exception (group=0x40d42930)
07-13 01:55:43.575: E/AndroidRuntime(15805): FATAL EXCEPTION: main
07-13 01:55:43.575: E/AndroidRuntime(15805): java.lang.ArrayIndexOutOfBoundsException: length=1; index=1
07-13 01:55:43.575: E/AndroidRuntime(15805):    at com.example.testlayout.Administrare$1.onItemClick(Administrare.java:161)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.widget.AdapterView.performItemClick(AdapterView.java:298)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.widget.AbsListView.performItemClick(AbsListView.java:1100)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:2749)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.widget.AbsListView$1.run(AbsListView.java:3423)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.os.Handler.handleCallback(Handler.java:725)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.os.Looper.loop(Looper.java:137)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at android.app.ActivityThread.main(ActivityThread.java:5041)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at java.lang.reflect.Method.invokeNative(Native Method)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at java.lang.reflect.Method.invoke(Method.java:511)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-13 01:55:43.575: E/AndroidRuntime(15805):    at dalvik.system.NativeStart.main(Native Method)

所以问题是当他到达第二排时..

【问题讨论】:

  • 当索引超出范围时,列[0] 中有什么内容?

标签: java android string split


【解决方案1】:

当它们之间有超过 3 个空格时,有没有办法拆分它们?

是的,请使用此正则表达式"\\s{3,}",这意味着 3 个或更多空格

See more on Regular Expressions here

也是你的最后一行

总计:746.54

除非你处理它会导致问题

读取该行后,您在文件中得到了什么?

你可以输入一个 if 来检查列的长度是 3

if(columns.length == 3)
    // Assign your values
else
    // Log error in reading

【讨论】:

  • 呵呵,我只是在检查这个:cheatography.com/davechild/cheat-sheets/regular-expressions 并试图找出一种将它们结合起来的方法。是的,我知道它会......我在写这个问题时记得它。就像我一样事实上,我的名字之间也可以有空格。我想我到那里后会处理的,呵呵。谢谢!
  • 这表明输入文件中的某些内容不正确,因为“Bulion 1 2.25”之后的行没有被拆分或已读入的行中没有任何内容,请参见columns[0] =
  • 是的,在做了一些其他事情之后,我回到了这个问题,确实,我发现了问题。我正在写这样的文件:String myFormat = "%-20s\t\t%-5s\t\t%-5s%n"; 所以在每一行之间都有一个空行。我的错,我没有检查我正在写的文件,呵呵。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
相关资源
最近更新 更多