Read and split text file into an array - Android

2020-02-16 03:31发布

问题:

I have gone through loads of these questions but still cant seem to figure it out. I have a text file split into rows. Each row consists of 5 pieces of data separated by a ",". I am trying to read this file and split the information into a string array in this form:

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

Please could someone help me out with a simple solution!? Thanks!!! :)

Data Example:

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

Sample Code:

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();
    }
}

ERRORS

07-24 06:26:56.524: E/AndroidRuntime(27203): FATAL EXCEPTION: main 07-24 06:26:56.524: E/AndroidRuntime(27203): java.lang.ArrayIndexOutOfBoundsException: length=10; index=10 07-24 06:26:56.524: E/AndroidRuntime(27203): at com.testingReadArray.weebly.testingReadArray.MainActivity.readFile(MainActivity.java:182) 07-24 06:26:56.524: E/AndroidRuntime(27203): at com.testingReadArray.weebly.testingReadArray.MainActivity$planOnClickListener.onItemSelected(MainActivity.java:148) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.widget.AdapterView.fireOnSelected(AdapterView.java:895) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.widget.AdapterView.access$200(AdapterView.java:50) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:863) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.os.Handler.handleCallback(Handler.java:615) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.os.Handler.dispatchMessage(Handler.java:92) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.os.Looper.loop(Looper.java:137) 07-24 06:26:56.524: E/AndroidRuntime(27203): at android.app.ActivityThread.main(ActivityThread.java:4867) 07-24 06:26:56.524: E/AndroidRuntime(27203): at java.lang.reflect.Method.invokeNative(Native Method) 07-24 06:26:56.524: E/AndroidRuntime(27203): at java.lang.reflect.Method.invoke(Method.java:511) 07-24 06:26:56.524: E/AndroidRuntime(27203): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007) 07-24 06:26:56.524: E/AndroidRuntime(27203): at 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)

回答1:

You could use a BufferedReader to read each line and then split the line using the .split(','); method.

Some pseudo code:

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++;
}   

Hope this helped!



回答2:

I assume you understand the basics of reading through a file. So let's start at where you have your String s equal to one full row:

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

You can call the split() function to return an array from s subdivided by some expression (in this case, a comma) like so:

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

Then you have row[0] = "John", row[1] = 22, and so on. You can do whatever you would like with these arrays, including store them in a multidimensional array if that's what you want to do.

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

Hopefully that's clear and I understood what you were trying to do correctly.



回答3:

See Using BufferedReader.readLine() in a while loop properly for an example of reading a file line by line using a buffered reader, then combine this with Kon's answer and I think you have a solution.

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(",");
    }
}