Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将accessdb表导出到csv_Java_Ms Access_Aws Lambda_Ucanaccess_Jackcess - Fatal编程技术网

Java 将accessdb表导出到csv

Java 将accessdb表导出到csv,java,ms-access,aws-lambda,ucanaccess,jackcess,Java,Ms Access,Aws Lambda,Ucanaccess,Jackcess,我正在编写一段java代码,将一些表从accessdb导出到CSV。我想将此代码部署为Lambda函数。我尝试过使用Jackcess,但是下面 try { String dateOfExtraction = LocalDateTime.now().toString(); Database db = DatabaseBuilder.open(new File("java-runtime/src/access_db_file.

我正在编写一段java代码,将一些表从accessdb导出到CSV。我想将此代码部署为Lambda函数。我尝试过使用Jackcess,但是下面

        try {
            String dateOfExtraction = LocalDateTime.now().toString();
            Database db = DatabaseBuilder.open(new File("java-runtime/src/access_db_file.accdb"));
            System.out.println(db.getTableNames());
            ExportUtil.exportFile(db, "table_name", new File("table_name" + dateOfExtraction + ".csv"));
        } catch (IOException e) {
            e.printStackTrace();
        }
抛出错误:
java.io.FileNotFoundException:给定文件不存在:C:\Users\john.doe.ctr\Desktop\Work\table\u name


我在mac上运行代码,此文件路径来自为我提供DB的用户。这是某种权限错误吗?我应该改用UCanAccess吗?我不能使用任何UCanAccess命令行工具,我必须在lambda中运行它。
System.out.println(db.getTableNames())行完全按照预期工作,并打印accessdb中所有表名的列表。

代码中可能存在一些问题

首先,您使用
LocalDateTime.now().toString()
作为CSV文件名的一部分,该文件将保存信息。它将为您提供如下信息:

2021-05-02T23:42:03.282
在某些操作系统中——您提到了MacOS,但它应该允许您使用该名称创建文件——该名称可能是问题的原因;请考虑使用一些不易出错的代码,如<代码>系统。CurrutTimeMix< /C> >:

String filename=“table_name”+System.currentTimeMillis()+”.csv”;
ExportUtil.exportFile(db,“表_名称”,新文件(文件名));
话虽如此,请注意,在AWS Lambda函数中,您可能需要将结果存储在外部存储器中,通常是S3:您可以写入文件系统,但在使用临时文件而不是持久存储时,它通常是相关的。请考虑下面的代码片段,

//在尝试访问文件系统时,您可能也会遇到问题
//读取访问文件,但API不提供其他选项
//可能正在部署(https://docs.aws.amazon.com/lambda/latest/dg/lambda-java.html)
//你的lambda功能就像一个容器(https://docs.aws.amazon.com/lambda/latest/dg/java-image.html) 
//并包括您的数据库文件
Database db=DatabaseBuilder.open(新文件(“java runtime/src/access_db_File.accdb”);
System.out.println(db.getTableNames());
字符串filename=“table_name”+System.currentTimeMillis()+”.csv”;
//通过写入程序写入字节数组,而不是写入文件
try(ByteArrayOutputStream输出=newbytearrayoutputstream();
BufferedWriter=新的BufferedWriter(
新的OutputStreamWriter(输出));
) {
//转储数据
ExportUtil.exportWriter(db,“表名称”,writer);
//以防万一
writer.flush();
//获取实际信息
字节[]数据=输出。toByteArray();
//将数据保存到S3:请考虑重构和组织代码
s3客户端s3=…;//根据需要初始化
String bucketName=“您的桶”;
String objectKey=filename;//对象键,例如与filename相同
//执行实际的S3请求
PutObjectResponse=s3.putObject(
PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build(),
RequestBody.fromBytes(数据)
);
}捕获(IOE异常){
e、 printStackTrace();
}
从完全不同的角度来看,问题可能是由于
表\u name
是一个。创建链接表时,需要定义链接信息的路径:在您的情况下,此信息可能存储在客户端原始计算机的
C:\Users\john.doe.ctr\Desktop\Work\table\u name

如果您有MS Access程序,您可以在的帮助下验证这是否是实际问题

如果您没有MS Access程序,也可以。请考虑下面的例子:

Database db=DatabaseBuilder.open(新文件(“java runtime/src/access_db_File.accdb”);
Table Table=db.getTable(“Table_name”);
布尔值isLinkedTable=db.isLinkedTable(表);
如果表是链接的,您需要两件事:一方面,链接的信息本身,另一方面,您需要提供接口的方便实现,可能是通过扩展。该接口基本上为您提供了将链接表的位置映射到不同路径的能力。请考虑一个方便的例子,例如实现。 例如,可以这样想:

公共类重新采样解算器实现链接解析器{
//保持原始链接数据库文件之间的对应关系
//在新文件系统中使用相同的数据库
私有映射dbLinkedFileMap=newHashMap();
public void重新映射(字符串originalLinkeeFileName、字符串newLinkeeFileName){
this.dblinkeefilemap.put(originalLinkeeFileName,newLinkeeFileName);
}
@凌驾
公共数据库resolveLinkedDatabase(数据库LinkedDB,
字符串链接文件名)
抛出IOException{
//如果链接器是只读的,请以只读方式打开链接器
布尔只读=((DatabaseImpl的linkerDb实例)?
((DatabaseImpl)LinkedB.isReadOnly():false);
字符串newLinkedFileName=this.dbLinkedFileMap.get(LinkedFileName);
if(newLinkeeFileName!=null){
返回新的DatabaseBuilder(新文件(NewLinkedeFileName))
.setReadOnly(readOnly).open();
}
//退回到默认状态
返回LinkResolver.DEFAULT.resolveLinkedDatabase(linkerDb,linkeeFileName);
}
}
然后,在代码中使用它:

Database db=DatabaseBuilder.open(新文件(“java runtime/src/access_db_File.accdb”);
RemapLinkResolver linkResolver=新的RemapLinkResolver();
链接解析程序重新映射(
“C:\Users\john.doe.ctr\Desktop\Work\table\u name”,
“java运行时/src/table_name.accdb”
);
db.setLinkResolver(linkResolver);
//照常继续

我希望您能理解这个想法,请调整路径,并根据需要修改代码。

Jccs建议看起来非常可靠。能溜溜球吗