在 java 中更有效地执行此任务以使用 CSV 插入 Room 数据库的方法

ways to perform this task in java more efficiently to insert in Room database using CSV

我的 csv 文件有这样的内容

22,Boy,"Sri shandarachary, founder of adwaitha philosophy",Aadhishankar,Bengali

因为它在标记内有逗号,这就是为什么我得到错误的结果,得到的是名称的描述而不是名称本身

它在单个标记内有逗号,但被“”包围着

private List<BabyName> readData() {
    List<BabyName> babyNames = new ArrayList<>();
    InputStream is = getResources().openRawResource(R.raw.babynames);
    BufferedReader reader = new BufferedReader(
            new InputStreamReader(is, Charset.forName("UTF-8"))
    );
    String line = "";

    try {
        reader.readLine();
        String mGender, mMeaning, mName, mOrigin;
        while ((line = reader.readLine()) != null) {
            Log.d("MyActivity", "Line: " + line);

            String[] tokens = line.split(",");
            mGender = tokens[1];
            mMeaning = tokens[2];
            mName = tokens[3];
            mOrigin = tokens[4];

            BabyName babyName = new BabyName(mGender, mMeaning, mName, mOrigin);
            babyNames.add(babyName);
            Log.d(TAG, "Just created: " + mGender + mMeaning + mName + mOrigin);
        }

        database.babyDao().insertAll(babyNames);
    } catch (IOException e) {
        Log.wtf("MyActivity", "Error reading data file on line" + line, e);
        e.printStackTrace();
    }

    return babyNames;
}

这是我的 github 仓库,请随时提出 Pull 请求!!在这方面需要帮助

https://github.com/vivekpanchal/BabyApp

我想我找到了适合你的解决方案。

就是按索引遍历每个字符。

@Test
public void test() {
    String line = "22,Boy,\"Sri shandarachary, founder of adwaitha philosophy\",Aadhishankar,Bengali";
    List<String> result = new ArrayList<>(4);
    StringBuilder value = new StringBuilder();
    boolean inString = false;
    for (int index=0; index<line.length(); index++) {
        switch (line.charAt(index)) {
            case ',':
                if (inString) {
                    value.append(line.charAt(index));
                } else {
                    result.add(value.toString());
                    value = new StringBuilder();
                }
                break;
            case '\"':
                inString = !inString;
                break;
                default:
                    value.append(line.charAt(index));
        }
    }
    result.add(value.toString());
    for (String string : result) {
        System.out.println(string);
    }
}

System.out :

22
Boy
Sri shandarachary, founder of adwaitha philosophy
Aadhishankar
Bengali

Process finished with exit code 0

尝试Commons CSV Parser

@Nullable private List<BabyName> readData() {
  InputStream in = null;
  BufferedReader reader = null

  try {
    List<BabyName> babyNames = new ArrayList<>();

    // open input stream to raw resource
    in =  = getResources().openRawResource(R.raw.babynames);

    // create a reader from it
    reader = new BufferedReader(new InputStreamReader(in));

    // parse as CSV
    CSVParser parser = CSVParser.DEFAULT.parse(reader);

    // get records
    for(CSVRecord record : parser){
      // Use the record.get(...) methods to get the column values
      // create BabyName from CSVRecord
      BabyName babyName = BabyName.fromCSVRecord(record);
      // Do whatever you want with the object
      // let's add it to the list of names
      babyNames.add(babyName);
    }

    return babyNames;
  } catch(Exception ex){
    Log.e(ex);
    return null;
  } finally {
    // always release the inputstream and reader
    Utils.closeSilently(reader);
    Utils.closeSilently(in);
  }
}

确保查看 https://commons.apache.org/proper/commons-csv/archives/1.5/apidocs/index.html

上的文档