android - 从 csv 读取到 sqlite 时的分隔符问题
问题描述
我尝试了网络上的所有搜索,但无法找到解决方案。我设法创建了一个 csv 文件(如图所示)。但是在将它导入到 sqlite 时,无论我做什么,我都无法在我的 sqlite 中的正确位置有正确的行,我相信这是关于分隔符的,但找不到你能帮我吗,我正在寻找它最后 2 天。谢谢你
File exportDir = new File(Environment.getExternalStorageDirectory(), "/XXX/");
if (!exportDir.exists()) { exportDir.mkdirs(); }
File file2 = new File(exportDir, "XXX.csv");
FileReader file = new FileReader(file2);
BufferedReader buffer = new BufferedReader(file);
ContentValues contentValues=new ContentValues();
String line = "";
String tableName =WordListOpenHelper.MY_LIST_TABLE;
db.beginTransaction();
while ((line = buffer.readLine()) != null)
{
x++;
String[] str = line.split("\\+");
if (x>5) {
contentValues.put(Contract.WordList.KEY_ENTRY, str[0]);
contentValues.put(Contract.WordList.KEY_NICKNAME_DATE, str[1]);
contentValues.put(Contract.WordList.KEY_LOCATION, str[2]);
contentValues.put(Contract.WordList.KEY_LOCATION_IMAGE, str[3]);
contentValues.put(Contract.WordList.KEY_HEART, str[4]);
db.insert(tableName, null, contentValues);
}
}
db.setTransactionSuccessful();
db.endTransaction();
和 CSVWriter 类
public class CSVWriter {
private PrintWriter pw;
private String separator;
private char escapechar;
private String lineEnd;
private char quotechar;
public static final String DEFAULT_SEPARATOR = "+\n";
public static final char NO_QUOTE_CHARACTER = '\u0000';
public static final char NO_ESCAPE_CHARACTER = '\u0000';
public static final String DEFAULT_LINE_END = "+\n";
public static final char DEFAULT_QUOTE_CHARACTER = '"';
public static final char DEFAULT_ESCAPE_CHARACTER = ' ';
public CSVWriter(Writer writer) {
this(writer, DEFAULT_SEPARATOR, DEFAULT_QUOTE_CHARACTER,
DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END);
}
public CSVWriter(Writer writer, String separator, char quotechar, char escapechar, String lineEnd) {
this.pw = new PrintWriter(writer);
this.separator = separator;
this.quotechar = quotechar;
this.escapechar = escapechar;
this.lineEnd = lineEnd;
}
public void writeNext(String[] nextLine) {
try{
if (nextLine == null)
return;
StringBuffer sb = new StringBuffer();
for (int i = 0; i < nextLine.length; i++) {
if (i != 0) {
sb.append(separator);
}
String nextElement = nextLine[i];
if (nextElement == null)
continue;
if (quotechar != NO_QUOTE_CHARACTER)
sb.append(quotechar);
for (int j = 0; j < nextElement.length(); j++) {
char nextChar = nextElement.charAt(j);
if (escapechar != NO_ESCAPE_CHARACTER && nextChar == quotechar) {
sb.append(escapechar).append(nextChar);
} else if (escapechar != NO_ESCAPE_CHARACTER && nextChar == escapechar) {
sb.append(escapechar).append(nextChar);
} else {
sb.append(nextChar);
}
}
if (quotechar != NO_QUOTE_CHARACTER)
sb.append(quotechar);
}
sb.append(lineEnd);
pw.write(sb.toString());
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public void close() throws IOException {
pw.flush();
pw.close();
}
public void flush() throws IOException {
pw.flush();
}
}
文件管理器中的 CSV 文件:
解决方案
这不完全是 csv 文件,因此需要特殊处理。
使用此方法:
public String getLine(String line) {
line = line.trim();
if (line.isEmpty())
return "";
if (line.equals("\"\"+"))
return "";
if (line.length() <= 3)
return "";
return line.substring(1, line.length() - 1);
}
而这不是你的while
循环:
boolean noMoreLines = false;
for (int i = 1; i <= 5; i++) {
line = buffer.readLine();
if (line == null) {
noMoreLines = true;
break;
}
}
if (!noMoreLines) {
while ((line = buffer.readLine()) != null) {
contentValues.put(Contract.WordList.KEY_ENTRY, getLine(line));
if ((line = buffer.readLine()) != null)
contentValues.put(Contract.WordList.KEY_NICKNAME_DATE, getLine(line));
if ((line = buffer.readLine()) != null)
contentValues.put(Contract.WordList.KEY_LOCATION, getLine(line));
if ((line = buffer.readLine()) != null)
contentValues.put(Contract.WordList.KEY_LOCATION_IMAGE, getLine(line));
if ((line = buffer.readLine()) != null)
contentValues.put(Contract.WordList.KEY_HEART, getLine(line));
db.insert(tableName, null, contentValues);
}
}
推荐阅读
- server - 无法从外部 IP 访问 Minecraft 服务器
- angular - Angular中表格单元格上的单击事件
- python - 如何在没有 ''[] 的情况下打印
- vue.js - 我无法使用 vue 在表格中显示数据
- youtube-data-api - 将“madeForKids”参数添加到“youtube.liveBroadcasts.insert”API 时出现 500 错误
- javascript - 在下拉列表中,将 optgroup 名称设置为 JS 在 Firefox 中不起作用的选定选项文本
- file - 如何在静态 Web 服务器中处理 JSON?
- javascript - 我可以在选择选项旁边有一个按钮吗?如果不能,我可以将按钮放在外面并与选择中的选项连接吗?
- java - 使用相对布局和按钮将 videoView 覆盖在另一个 videoView 上
- amazon-s3 - 如果我在同一个存储桶中运行 aws s3 同步命令,我应该支付多少费用?