【问题标题】:Read and split text file into an array - Android读取文本文件并将其拆分为数组 - Android
【发布时间】:2013-07-23 09:26:21
【问题描述】:

我已经经历了很多这些问题,但似乎仍然无法弄清楚。我有一个分成几行的文本文件。每行由 5 条数据组成,以“,”分隔。我正在尝试读取此文件并将信息拆分为以下形式的字符串数组:

String [][] xyz = new String [5][100]; 

请有人帮我解决一个简单的问题!?谢谢!!! :)

数据示例:

John,22,1953,Japan,Green
Anna,18,2012,Mexico,Blue
Sam,34,1976,San Francisco,Pink

示例代码:

public void readFile(){

    AssetManager manger;
    String line = null;

    try {
        manger = getAssets();
        InputStream is = manger.open("data.txt");
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        while ((line = br.readLine()) != null) {
            values.add(line.split(","));
            //System.out.print(value);

        }
        br.close();


        String[] array = values.toArray(new String[20];


    } catch (IOException e1) {
        Toast.makeText(getBaseContext(), "Problem!", Toast.LENGTH_SHORT).show();
    }
}

错误

07-24 06:26:56.524: E/AndroidRuntime(27203): 致命异常: main 07-24 06:26:56.524: E/AndroidRuntime(27203): java.lang.ArrayIndexOutOfBoundsException: length=10;指数=10 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 com.testingReadArray.weebly.testingReadArray.MainActivity.readFile(MainActivity.java:182) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 com.testingReadArray.weebly.testingReadArray.MainActivity$planOnClickListener.onItemSelected(MainActivity.java:148) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.widget.AdapterView.fireOnSelected(AdapterView.java:895) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.widget.AdapterView.access$200(AdapterView.java:50) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:863) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.os.Handler.handleCallback(Handler.java:615) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.os.Handler.dispatchMessage(Handler.java:92) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.os.Looper.loop(Looper.java:137) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 android.app.ActivityThread.main(ActivityThread.java:4867) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 java.lang.reflect.Method.invoke(Method.java:511) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 07-24 06:26:56.524: E/AndroidRuntime(27203): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774) 07-24 06:26:56.524: E/AndroidRuntime(27203): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我的数据示例没有按应有的方式出现。在每种颜色之后,它变成一个新行......不仅仅是一个空格。 :)
  • 你能发布一些你尝试过的代码吗?

标签: java android arrays text split


【解决方案1】:

您可以使用 BufferedReader 读取每一行,然后使用 .split(','); 方法拆分该行。

一些伪代码:

BufferedReader bfr = new BufferedReader(InputStreamReader/FileReader...);
String line = null;
int index = 0;
String [][] xyz = new String [100][5];

while ( (line = bfr.readLine()) != null) {
    if (index < xyz.length) xyz[index] = line.split(",");
    index++;
}   

希望这有帮助!

【讨论】:

  • 它说“类型不匹配:无法从 String[] 转换为 String”wrt "xyz[index] = line.split(",");"
  • 声明 xyz[index] 时确保它是一个多维数组。如果它不是 xyz[index] 将返回一个字符串,而不是一个字符串数组。
  • 是的...并且我将所有内容都简化为仅读取前 10 个值...一旦我调用它读取然后显示值,我的应用程序就会崩溃。 ://
  • 在你的 catch 块中,放入 e1.printStackTrace();进入 logcat 并将您的错误粘贴到主帖中。
  • 希望有帮助吗?制作应用程序的新手:)
【解决方案2】:

我假设您了解读取文件的基础知识。因此,让我们从 String 等于一整行的地方开始:

String s = "John,22,1953,Japan,Green";

您可以调用 split() 函数从 s 中返回一个由某个表达式(在本例中为逗号)细分的数组,如下所示:

String[] row = s.split(","); //Returns a new String array {John,22,1953,Japan,Green}

然后你有 row[0] = "John"、row[1] = 22,等等。你可以对这些数组做任何你想做的事情,包括将它们存储在一个多维数组中,如果你想这样做的话。

String[][] xyz = new String[numRows][5];
xyz[0] = row;
System.out.println(xyz[0][0]); //prints "John"

希望这很清楚,我理解您正在尝试正确执行的操作。

【讨论】:

  • 是的,我明白它是如何工作的......但是从文件中读取它到将它放入数组中,这让我很困惑。一旦我可以将数据放入一个数组中,我就可以对其进行操作……但是将其从 TXT 文件中放入数组中,这简直是要了我的命!哈哈。 :)
【解决方案3】:

有关使用缓冲阅读器逐行读取文件的示例,请参阅 Using BufferedReader.readLine() in a while loop properly,然后将其与 Kon 的答案结合起来,我认为您有一个解决方案。

AssetManager manger;
String line = null;
List<String[]> xyzList = new ArrayList<String[]>();
String[][] xyz;  
InputStream is;
InputStreamReader isr;
BufferedReader br;
try {
    manger = getAssets();
    is = manager.open("data.txt");
    isr = new InputStreamReader(is);
    br = new BufferedReader(isr);
    while ((line = br.readLine()) != null) {
      xyzList.add(line.split(","));
    }
    xyz = (String[][])xyzList.toArray();
}catch (IOException e1) {
    Toast.makeText(getBaseContext(), "Problem!", Toast.LENGTH_SHORT).show();
}finally{
    br.close();
    isr.close();
    is.close();
}

【讨论】:

    【解决方案4】:
    /* Assuming you want a 5 by n matrix from this data
    John,22,1953,Japan,Green
    Anna,18,2012,Mexico,Blue
    Sam,34,1976,San Francisco,Pink
    .
    .
    .
    .
    nth row
    
    String[] row = s.split(","); */
    for (int i = 0; i<n i++)
    {
        for(int j = 0; j<originalString.length; j++)
        {
            xyz[i] = originalString[j].split(",");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2016-08-01
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多