web-dev-qa-db-ja.com

Android StudioでCSVファイルを配列に解析する方法

cSVファイルを解析して、その内容を配列に格納する方法を知りたいです。私のcsvファイルは次のようになります。

1,bulbasaur,1,7,69,64,1,1
2,ivysaur,2,10,130,142,2,1

名前だけが必要なので、2番目のフィールドです。これらのすべての項目をcsvに格納して、文字列の配列または配列リストに格納します。

これを行う方法はありますか?

どんな助けでも大歓迎です!

11
Varun Vu

AndroidでCSVファイルを配置する場所「res」フォルダー内に「raw」という名前のフォルダーを作成し、その中にCSVファイルを配置します。

CSVファイルの読み方、Android以来特別なものはありません。標準のJavaコードを使用します。APIに移動するのではなく、独自のコードを使用する方が適切です。次のクラスは、CSVファイルを読み取るためのユーティリティであり、CSVファイル内から使用できますAndroid application。csvファイルのアイテムを格納する配列これらの例では、これはscorelist arraylistです。

public class CSVFile {
    InputStream inputStream;

    public CSVFile(InputStream inputStream){
        this.inputStream = inputStream;
    }

    public List read(){
        List resultList = new ArrayList();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        try {
            String csvLine;
            while ((csvLine = reader.readLine()) != null) {
                String[] row = csvLine.split(",");
                resultList.add(row);
            }
        }
        catch (IOException ex) {
            throw new RuntimeException("Error in reading CSV file: "+ex);
        }
        finally {
            try {
                inputStream.close();
            }
            catch (IOException e) {
                throw new RuntimeException("Error while closing input stream: "+e);
            }
        }
        return resultList;
    }
}

それでは、「raw」フォルダからCSVファイルをロードし、上記のユーティリティを使用してそれを読み取る方法を教えてください。

InputStream inputStream = getResources().openRawResource(R.raw.stats);
CSVFile csvFile = new CSVFile(inputStream);
List scoreList = csvFile.read();

MainActivity.Java

public class MainActivity extends Activity {
    private ListView listView;
    private ItemArrayAdapter itemArrayAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listView);
        itemArrayAdapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_layout);

        Parcelable state = listView.onSaveInstanceState();
        listView.setAdapter(itemArrayAdapter);
        listView.onRestoreInstanceState(state);

        InputStream inputStream = getResources().openRawResource(R.raw.stats);
        CSVFile csvFile = new CSVFile(inputStream);
        List scoreList = csvFile.read();

        for(String[] scoreData:scoreList ) {
            itemArrayAdapter.add(scoreData);
        }
    }
}

ItemArrayAdapter.Java

public class ItemArrayAdapter extends ArrayAdapter {
    private List scoreList = new ArrayList();

    static class ItemViewHolder {
        TextView name;
        TextView score;
    }

    public ItemArrayAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

    @Override
    public void add(String[] object) {
        scoreList.add(object);
        super.add(object);
    }

    @Override
    public int getCount() {
        return this.scoreList.size();
    }

    @Override
    public String[] getItem(int index) {
        return this.scoreList.get(index);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ItemViewHolder viewHolder;
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) this.getContext().
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.item_layout, parent, false);
            viewHolder = new ItemViewHolder();
            viewHolder.name = (TextView) row.findViewById(R.id.name);
            viewHolder.score = (TextView) row.findViewById(R.id.score);
            row.setTag(viewHolder);
        } else {
            viewHolder = (ItemViewHolder)row.getTag();
        }
        String[] stat = getItem(position);
        viewHolder.name.setText(stat[0]);
        viewHolder.score.setText(stat[1]);
        return row;
    }
}

activity_mail.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    tools:context="com.javapapers.Android.csvfileread.app.MainActivity">
    <ListView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:id="@+id/listView"
        Android:layout_alignParentTop="true"
        Android:layout_centerHorizontal="true"
        Android:layout_marginTop="10dp" />
</RelativeLayout>

item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/name"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentLeft="true"
        Android:layout_marginLeft="20dp" />
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:id="@+id/score"
        Android:layout_alignParentTop="true"
        Android:layout_alignParentRight="true"
        Android:layout_marginRight="20dp" />
</RelativeLayout>

ソースコード全体については、これらのリンクを参照できます javapapers.com/wp-content/uploads/2014/07/CSVFileRead.Zip

それは役立つと思います

18
Shubham Sharma

免責事項:私はAndroidで作業したことがありませんが、Javaは知っているので、うまくいけばすべて同じです。

そうは言っても、このようなことを試すことができます。

Scanner scanner = new Scanner(new File("file.csv"));
ArrayList<String> pokemon = new ArrayList<>();
while(scanner.hasNextLine()) {
    pokemon.add(scanner.nextLine().split(",")[1]);
}
scanner.close();
2
kamoroso94

デフォルトでは、Androidはrawフォルダーを作成しません。プロジェクトのres/rawの下にrawフォルダーを作成します。その中にCSVファイルをコピーします。 CSVファイルの名前は小文字のままにし、要求されたときにテキスト形式に変換します。私のCSVファイル名はwelldata.scv WellDataです-これはゲッターとセッターを備えたモデルクラスです。 wellDataListは、データを格納するためのArrayListです。

private void readData() {
InputStream is = getResources().openRawResource(R.raw.welldata);
BufferedReader reader = new BufferedReader(
        new InputStreamReader(is, Charset.forName("UTF-8")));
String line = "";
try {
    while ((line = reader.readLine()) != null) {
       //set splitter
        String[] tokens = line.split(",");

        //read the data
        WellData wellData = new WellData();
        wellData.setOwner(tokens[0]);
        wellData.setApi(tokens[1]);
        wellData.setLongitude(tokens[2]);
        wellData.setLatitude(tokens[3]);
        wellData.setProperty(tokens[4]);
        wellData.setWellName(tokens[5]);
        wellDataList.add(wellData);

        Log.d("MainActivity" ,"Just Created " +wellData);

    }
} catch (IOException e1) {
    Log.e("MainActivity", "Error" + line, e1);
    e1.printStackTrace();
}

}}

0
Rohan

引用符で囲まれたフィールドを処理するより優れたCSVパーサー

    import Android.content.Context;
    import Android.widget.Toast;
    import Java.io.BufferedReader;
    import Java.io.File;
    import Java.io.FileInputStream;
    import Java.io.InputStream;
    import Java.io.InputStreamReader;
    import Java.util.ArrayList;
    import Java.util.List;

    public class CSVReader {
        private class StringDArray {
            private String[] data=new String[0];
            private int used=0;
            public void add(String str) {
                if (used >= data.length){
                    int new_size= used+1;
                    String[] new_data=new String[new_size];
                    Java.lang.System.arraycopy( data,0,new_data,0,used);
                    data=new_data;
                }
                data[used++] = str;
            }
            public int length(){
                return  used;
            }
            public String[] get_araay(){
                return data;
            }
        }
        private  Context context;
        public CSVReader(Context context){
            this.context=context;
        }
        public List read(File file){
            List resultList = new ArrayList();
            try{
                InputStream inputStream= new FileInputStream(file);
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                String csvLine;
                final char Separator = ',';
                final char Delimiter = '"';
                final char LF = '\n';
                final char CR = '\r';
                boolean quote_open = false;
                while ((csvLine = reader.readLine()) != null) {
                    //String[] row = csvLine.split(",");// simple way
                    StringDArray a=new StringDArray();
                    String token="";
                        csvLine+=Separator;
                    for(char c:csvLine.toCharArray()){
                        switch (c){
                            case LF: case CR:// not required as we are already read line
                                quote_open=false;
                                a.add(token);
                                token="";
                            break;
                            case Delimiter:
                                quote_open=!quote_open;
                            break;
                            case Separator:
                                if(quote_open==false){
                                    a.add(token);
                                    token="";
                                }else{
                                    token+=c;
                                }
                            break;
                            default:
                                token+=c;
                            break;
                        }
                    }
                    if(a.length()>0 ) {
                        if(resultList.size()>0){
                            String[] header_row =(String[]) resultList.get(0);
                            if(a.length()>=header_row.length) {
                                String[] row = a.get_araay();
                                resultList.add(row);
                            }
                        }else{
                            String[] row = a.get_araay();
                            resultList.add(row);//header row
                        }
                    }
                }
                inputStream.close();
            }catch (Exception e){
                Toast.makeText(context,"Error : " + e.getMessage(), Toast.LENGTH_LONG).show();
            }
            return resultList;
        }
    }

使用方法

    File file=new File(path);
    CSVReader csvReader=new CSVReader(activity.this);
    List csv=csvReader.read(file);
    if(csv.size()>0){
        String[] header_row =(String[]) csv.get(0);
        if(header_row.length>1){
            String col1=header_row[0];
            String col2=header_row[1];
        }
    }

    Toast.makeText(activity.this,csv.size() + " rows", Toast.LENGTH_LONG).show();

使用したサンプルデータ
ID、名前
1、テスト項目1
"2"、 "テスト項目2"
"3"、 "テスト、アイテム3"
4、テスト項目4

0
Joshy Francis

Sharmaの回答を拡張して、CSVファイルのさまざまな条件でコアクラスをより柔軟にしました。私は、CSVファイルの読み取り方法を構成するためのビルダー設計パターンを好みます。

public class CSVFile {
    private static final Charset UTF8 = Charset.forName("UTF-8");
    private final static String DEFAULT_DELIMITER = ",";

    private InputStream inputStream;
    private Charset charset;
    private String delimiter;
    private boolean ignoreHead;

    public CSVFile(InputStream inputStream) {
        this.inputStream = inputStream;
        this.charset = UTF8;
        this.delimiter = DEFAULT_DELIMITER;
        this.ignoreHead = false;
    }

    public CSVFile setCharset(Charset charset) {
        this.charset = charset;
        return this;
    }

    public CSVFile setDelimiter(String delimiter) {
        this.delimiter = delimiter;
        return this;
    }

    public CSVFile ignoreHead() {
        ignoreHead = true;
        return this;
    }

    public List<String[]> read() {
        boolean firstRow = true;
        List<String[]> resultList = new ArrayList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
        try {
            String csvLine;
            while ((csvLine = reader.readLine()) != null) {
                if (firstRow) {
                    firstRow = false;

                    if (ignoreHead) {
                        continue;
                    }
                }

                String[] row = csvLine.split(delimiter);
                resultList.add(row);
            }
        } catch (IOException ex) {
            throw new RuntimeException("Error in reading CSV file: " + ex);
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException("Error while closing input stream: " + e);
            }
        }
        return resultList;
    }
}
0
Emi Raz