无法将数据类型与 jackcess 一起使用以将 DB 导出到 csv
Cannot use data types with jackcess to export DB to csv
所以我有一个选择数据库并将其导出为 csv 的程序。当我导出数据库时,制表符分隔似乎不保留任何数据类型。理想情况下,csv 应将文本字段保留为“####”、“##”
而不仅仅是####,##。
尽管这些字段是 "numbers",但无需将它们视为数字。缺少格式会导致排序出现小问题,我可以看到 jackcess 支持数据类型,但我是否需要使用游标来保留这些数据类型,或者我是否仍可以使用 exportFile() 函数?
public DBTool() {
JOptionPane.showMessageDialog(null, "Select an access database file to be converted to .csv");
String userhome = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(userhome);
//chooser.setCurrentDirectory(new java.io.File("."));
chooser.setDialogTitle("Choose Database to Convert");
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory());
System.out.println("getSelectedFile() : " + chooser.getSelectedFile());
source = chooser.getSelectedFile().toString();
destination = chooser.getCurrentDirectory() + "\output.csv";
System.out.println("Source: " + source);
System.out.println("Destination: " + destination);
} else {
System.out.println("No Selection ");
}
}
public void openEDB(){
sourceF = new File(source);
long length = sourceF.length();
System.out.println(length);
try {
try {
db = new DatabaseBuilder(sourceF)
.setCodecProvider(new CryptCodecProvider("password"))
.open();
} catch (IOException ex) {
Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
}
db = DatabaseBuilder.open(sourceF);
} catch (IOException ex) {
Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void exportDB(){
destinationF = new File(destination);
try {
ExportUtil.exportFile(db, "TableName", destinationF);
JOptionPane.showMessageDialog(null, "Success, .csv created: " + this.destination);
} catch (IOException ex) {
Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我不知道有什么方法可以强制 Jackcess 在导出时将所有文本字段用双引号引起来。但是,无论如何,这不会影响 Jackcess 导出行的顺序。
当使用 exportFile() 时,Jackcess 将以 自然顺序 导出行,这是行在 table 中物理存在的顺序(通常,但并非总是,将行插入 table).
的顺序
使用exportWriter() with a Cursor时,Jackcess 将按照游标定义的顺序导出行。因此,如果您要对输出进行排序的字段上有一个索引,那么您可以创建一个 IndexCursor 并使用带有该 Cursor 的 exportWriter() 将行转储到 CSV。
如果要对输出进行排序的字段没有索引,并且您不能(或不愿意)在 Access 数据库中创建这样的索引,那么另一种方法是使用 UCanAccess JDBC driver to create a ResultSet based on an SQL statement that has an ORDER BY clause, then use something like opencsv 将结果集转储为 CSV。
所以我有一个选择数据库并将其导出为 csv 的程序。当我导出数据库时,制表符分隔似乎不保留任何数据类型。理想情况下,csv 应将文本字段保留为“####”、“##” 而不仅仅是####,##。 尽管这些字段是 "numbers",但无需将它们视为数字。缺少格式会导致排序出现小问题,我可以看到 jackcess 支持数据类型,但我是否需要使用游标来保留这些数据类型,或者我是否仍可以使用 exportFile() 函数?
public DBTool() {
JOptionPane.showMessageDialog(null, "Select an access database file to be converted to .csv");
String userhome = System.getProperty("user.home");
JFileChooser chooser = new JFileChooser(userhome);
//chooser.setCurrentDirectory(new java.io.File("."));
chooser.setDialogTitle("Choose Database to Convert");
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setAcceptAllFileFilterUsed(false);
if (chooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
System.out.println("getCurrentDirectory(): " + chooser.getCurrentDirectory());
System.out.println("getSelectedFile() : " + chooser.getSelectedFile());
source = chooser.getSelectedFile().toString();
destination = chooser.getCurrentDirectory() + "\output.csv";
System.out.println("Source: " + source);
System.out.println("Destination: " + destination);
} else {
System.out.println("No Selection ");
}
}
public void openEDB(){
sourceF = new File(source);
long length = sourceF.length();
System.out.println(length);
try {
try {
db = new DatabaseBuilder(sourceF)
.setCodecProvider(new CryptCodecProvider("password"))
.open();
} catch (IOException ex) {
Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
}
db = DatabaseBuilder.open(sourceF);
} catch (IOException ex) {
Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void exportDB(){
destinationF = new File(destination);
try {
ExportUtil.exportFile(db, "TableName", destinationF);
JOptionPane.showMessageDialog(null, "Success, .csv created: " + this.destination);
} catch (IOException ex) {
Logger.getLogger(DBTool.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
我不知道有什么方法可以强制 Jackcess 在导出时将所有文本字段用双引号引起来。但是,无论如何,这不会影响 Jackcess 导出行的顺序。
当使用 exportFile() 时,Jackcess 将以 自然顺序 导出行,这是行在 table 中物理存在的顺序(通常,但并非总是,将行插入 table).
的顺序使用exportWriter() with a Cursor时,Jackcess 将按照游标定义的顺序导出行。因此,如果您要对输出进行排序的字段上有一个索引,那么您可以创建一个 IndexCursor 并使用带有该 Cursor 的 exportWriter() 将行转储到 CSV。
如果要对输出进行排序的字段没有索引,并且您不能(或不愿意)在 Access 数据库中创建这样的索引,那么另一种方法是使用 UCanAccess JDBC driver to create a ResultSet based on an SQL statement that has an ORDER BY clause, then use something like opencsv 将结果集转储为 CSV。