web-dev-qa-db-fra.com

Comment analyser un fichier CSV dans un tableau dans Android Studio

je me demande comment analyser un fichier CSV et simplement stocker le contenu dans un tableau. Mon fichier csv ressemble à ceci:

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

Je veux seulement les noms, donc le deuxième champ. Je veux stocker tous ces éléments dans le csv dans un tableau ou une liste de chaînes. 

Des idees pour faire cela?

Toute aide serait grandement appréciée!

7
Varun Vu

Où placer le fichier CSV sous Android Créez un dossier nommé "raw" dans le dossier "res" et placez-y le fichier CSV. 

Comment lire un fichier CSV , Rien de spécial depuis son Android. Nous allons tous utiliser notre code Java standard. Il est préférable d’utiliser notre propre code au lieu d’utiliser une API. La classe suivante est un utilitaire permettant de lire un fichier CSV et pouvant être utilisé à partir de l'application Android. Dans quel tableau nous allons stocker les éléments du fichier csv Dans cet exemple, il s'agit de 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;
    }
}

Alors, comment charger le fichier CSV à partir du dossier «raw» et utiliser l’utilitaire ci-dessus pour le lire?

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>

Pour le code source complet, vous pouvez vous référer à ces liens javapapers.com/wp-content/uploads/2014/07/CSVFileRead.Zip

Je pense que cela aidera

16
Shubham Sharma

Disclaimer: Je n'ai jamais travaillé avec Android, mais je connais Java, donc j'espère que c'est tout pareil.

Cela étant dit, vous pouvez essayer quelque chose comme ça.

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 par défaut ne crée pas le dossier brut. Créez un dossier brut sous res/raw dans votre projet. copiez votre fichier CSV dans cela. conservez le nom du fichier CSV en minuscule et convertissez-le au format texte à la demande. mon nom de fichier CSV est welldata.scv WellData - c'est la classe de modèle avec getter et setter. wellDataList est le ArrayList pour stocker les données.

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

Un meilleur analyseur CSV gère les champs cités

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

Utilisation

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

Exemple de données utilisées
ID, Nom
1, Test Item 1
"2", "Test Item 2"
"3", "Test, élément 3"
4, Test Item 4

0
Joshy Francis