【问题标题】:Reading CSV file in resources folder android在资源文件夹android中读取CSV文件
【发布时间】:2013-11-14 10:03:38
【问题描述】:

我正在 netbeans 中开发一个 android 应用程序。我正在尝试使用 opencsv 读取 CSV 文件。当我将文件放入资源文件夹并尝试从那里读取它时,在构建无效资源目录时出现错误。我应该在哪里存储 csv 文件,以便每次应用程序启动时都可以读取它?

【问题讨论】:

    标签: android opencsv


    【解决方案1】:

    你应该把 csv 文件放在 assets 文件夹中 ..

    InputStreamReader is = new InputStreamReader(getAssets()
                            .open("filename.csv"));
    
    BufferedReader reader = new BufferedReader(is);
    reader.readLine();
    String line;
    while ((line = reader.readLine()) != null) {
                            
    }
    

    【讨论】:

      【解决方案2】:

      一些建议;

      • 创建一个对象,用于将一行数据保存到 csv 中。 (Ex: YourSimpleObject。它让您轻松管理数据。)
      • 逐行读取文件并分配给对象。将对象添加到列表中。 (例如:ArrayList<YourSimpleObject >

      代码:

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

      【讨论】:

      • 不错的解决方案。 (我喜欢它不需要添加外部库)
      【解决方案3】:

      作为替代方案,请查看uniVocityParsers。它提供了大量解析分隔文件的方法。下面的示例将一个 Csv 文件(见下图)从 res/raw 文件夹加载到 InputStream 对象中,并以列的方式读取它(key=Column & 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();
      

      要将 univocityParsers 添加到您的 Android 项目中:

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

      【讨论】:

        【解决方案4】:

        使用 opencsv:

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

        【讨论】:

          【解决方案5】:

          您可以使用此代码

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

          您可以从以下位置下载 csvreader 文件 http://sourceforge.net/projects/opencsv/files/latest/download

          并导入您的项目

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-11-12
            • 1970-01-01
            • 1970-01-01
            • 2017-05-18
            • 2023-03-24
            • 2011-01-22
            • 2018-01-19
            • 2019-10-16
            相关资源
            最近更新 更多