在 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 请求!!在这方面需要帮助
我想我找到了适合你的解决方案。
就是按索引遍历每个字符。
@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
@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
上的文档
我的 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 请求!!在这方面需要帮助
我想我找到了适合你的解决方案。
就是按索引遍历每个字符。
@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
@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
上的文档