2016-07-16 140 views
7

Mi chiedo come analizzare un file CSV e archiviare semplicemente il contenuto in un array. Il mio file csv è simile al seguente:Come analizzare il file CSV in un array in Android Studio

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

Voglio solo i nomi, quindi il secondo campo. Voglio memorizzare tutti questi elementi nel CSV in un array o arraylist di stringa.

Qualche idea su come procedere?

Qualsiasi aiuto sarebbe molto apprezzato!

risposta

9

dove mettere il file CSV in Android Creare una cartella denominata “raw” all'interno della cartella “res” e mettere il file CSV in esso.

Come leggere il file CSV, Niente di speciale dal suo Android. Tutto ciò che useremo sarà il nostro codice Java standard. È meglio usare il nostro codice invece di andare a un'API. La seguente classe è un'utilità per leggere il file CSV e può essere utilizzata dall'interno dell'applicazione Android. In quale array verranno memorizzati gli elementi del file csv In questo esempio è l'arraylist scorelist.

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

Così come caricare il file CSV dalla cartella “raw” e utilizzare l'utilità sopra per leggerlo?

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> 

Per l'intero codice sorgente è possibile si riferisce a questo link javapapers.com/wp-content/uploads/2014/07/CSVFileRead.zip

penso che vi aiuterà

1

Disclaimer: Non ho mai lavorato con Android, ma conosco Java, quindi spero che sia lo stesso.

Detto questo, puoi provare qualcosa di simile.

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

Android di default non crea la cartella grezzo . Crea una cartella raw sotto res/raw nel tuo progetto. copia il tuo file CSV in questo. mantenere il nome del file CSV in minuscolo e convertirlo in formato testo quando richiesto. il mio nome file CSV è welldata.scv WellData: è la classe del modello con getter e setter. wellDataList è ArrayList per memorizzare i dati.

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

}}

Problemi correlati