2013-11-14 14 views
6

Ich entwickle eine Android-App in Netbeans. Ich versuche CSV-Datei mit opencsv zu lesen. Wenn ich die Datei in den Ressourcenordner lege und versuche, sie von dort zu lesen, gibt es einen Fehler beim Erstellen eines ungültigen Ressourcenverzeichnisses. Wo sollte ich die CSV-Datei speichern, damit sie bei jedem Start der App gelesen werden kann?Lesen CSV-Datei in Ressourcen-Ordner Android

Antwort

7

Sie in Assets Ordner setzen CSV-Datei sollte ..

InputStreamReader is = new InputStreamReader(getAssets() 
         .open("filename.csv")); 

       BufferedReader reader = new BufferedReader(is); 
       reader.readLine(); 
       String line; 
       while ((line = reader.readLine()) != null) { 

        } 
1

Sie diesen Code verwenden können

try { 
       InputStream csvStream = assetManager.open(CSV_PATH); 
       InputStreamReader csvStreamReader = new  InputStreamReader(csvStream); 
       CSVReader csvReader = new CSVReader(csvStreamReader); 
       String[] line; 

       // throw away the header 
       csvReader.readNext(); 

       while ((line = csvReader.readNext()) != null) { 
        questionList.add(line); 
       } 
       } catch (IOException e) { 
       e.printStackTrace(); 
       } 

Sie CSVReader Datei von http://sourceforge.net/projects/opencsv/files/latest/download

und Import in Ihrem Projekt herunterladen können

7

Einige Ratschläge;

  • Erstellen Sie ein Objekt für das Halten einer Zeile Daten in der CSV. (Ex: YourSimpleObject. Es bietet Ihnen die Verwaltung der Daten leicht.)
  • Datei Zeile für Zeile lesen und Objekt zuweisen. Fügen Sie das Objekt zur Liste hinzu. (Ex: ArrayList<YourSimpleObject >)

Code:

private void readAndInsert() throws UnsupportedEncodingException { 


ArrayList<YourSimpleObject > objList= new ArrayList<YourSimpleObject >(); 
AssetManager assetManager = getAssets(); 
InputStream is = null; 

      try { 
       is = assetManager.open("questions/question_bank.csv"); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      BufferedReader reader = null; 
      reader = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8"))); 

      String line = ""; 
      StringTokenizer st = null; 
      try { 

       while ((line = reader.readLine()) != null) { 
        st = new StringTokenizer(line, ","); 
        YourSimpleObject obj= new YourSimpleObject(); 
            //your attributes 
        obj.setX(st.nextToken()); 
        obj.setY(st.nextToken()); 
        obj.setZ(st.nextToken()); 
        obj.setW(st.nextToken()); 

        objList.add(sQuestion); 

       } 
      } catch (IOException e) { 

       e.printStackTrace(); 
      } 



} 
0

Mit opencsv:

InputStream is = context.getAssets().open(path); 
InputStreamReader reader = new InputStreamReader(is, Charset.forName("UTF-8")); 
List<String[]> csv = new CSVReader(reader).readAll(); 
1

Als Alternative einen Blick auf uniVocityParsers nehmen. Es bietet eine Vielzahl von Möglichkeiten zum Parsen von Dateien mit Trennzeichen. Im folgenden Beispiel wird eine Csv-Datei (siehe unten) aus einem res/raw-Ordner in ein InputStream-Objekt geladen und in einer colunaren Weise gelesen (eine Map mit Schlüssel = Spalte & value = ColumnValues).

calendario_bolsa.csv

//Gets your csv file from res/raw dir and load into a InputStream. 
InputStream csvInputStream = getResources().openRawResource(R.raw.calendario_bolsa); 

//Instantiate a new ColumnProcessor 
ColumnProcessor columnProcessor = new ColumnProcessor(); 

//Define a class that hold the file configuration 
CsvParserSettings parserSettings = new CsvParserSettings(); 
parserSettings.getFormat().setLineSeparator("\n"); 
parserSettings.setHeaderExtractionEnabled(true); 
parserSettings.setProcessor(columnProcessor); 

//Creates a new CsvParser, passing the settings into its construtor: 
CsvParser csvParser = new CsvParser(parserSettings); 

//Calls parse method, instantiating an InputStreamReader, passing to its constructor the InputStream object 
csvParser.parse(new InputStreamReader(csvInputStream)); 

//Gets the csv data as a Map of Column/column values. 
Map<String, List<String>> columnarCsv = columnProcessor.getColumnValuesAsMapOfNames(); 

Um univocityParsers in Ihr Android-Projekt hinzufügen:

compile group: 'com.univocity', name: 'univocity-parsers', version: '2.3.0'