gpt4 book ai didi

java - 如何将数据写入 csv 文件中的单独列

转载 作者:太空宇宙 更新时间:2023-11-04 13:27:16 26 4
gpt4 key购买 nike

嗨,我想编写一个 Web 应用程序,它接受 excel 文件,然后将其转换为 csv 文件并将其上传到数据库,对此数据进行一些 sql 查询并将输出发送给用户。我在 Mac 中遇到了一个问题,它运行得很好,但在 Windows 上却抛出异常。抛出的异常是 java.sql.SQLSyntaxErrorException: ORA-00900。我已经检查了 SQL 查询,它应该可以工作,而且它在我的 mac 上工作得很好。所以我认为问题可能出在我的 csv 文件中。在Mac上,它将从Excel到csv的数据写入不同的列(单元格)中,但是当我使用Excel打开我的csv文件时,它会将所有内容写入一个单元格。所以我很困惑。有人可以帮我解决这个问题吗?这是我的代码:

package dto;

import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.csvreader.CsvWriter;

import servlets.Serv1;


public class Converter {
public final String COMA_DELIMITER=" ,";
String newname;
public File converting(File file, String p){
Path path=Paths.get(file.getName());

String filename=path.getFileName().toString();
String extension = filename.substring(filename.lastIndexOf(".") + 1, filename.length());
if(extension.equals("csv"))
return file;
else if(extension.equals("xls")||extension.equals("xlsx")){
try{
newname=p+File.separator+filename.substring(0, filename.lastIndexOf("."))+".csv";
CsvWriter csvOutput=new CsvWriter(new FileWriter(newname,true), ',');
System.out.println("I am delimiter "+csvOutput.getDelimiter());
Workbook wb;
if(extension.equals("xls")){
wb=new HSSFWorkbook(new FileInputStream(file));
}
else{
wb = new XSSFWorkbook(new FileInputStream(file));
}
Sheet s=wb.getSheetAt(0);
Row row = null;
int j=0;
Integer val;
for(int i=0; i<s.getPhysicalNumberOfRows(); i++){
row=s.getRow(i);
Cell c=row.getCell(j);
if(c.getCellType()!=Cell.CELL_TYPE_NUMERIC)
continue;
else{

val=(int) c.getNumericCellValue();
csvOutput.write(Integer.toString(val));
//csvOutput.endRecord();
//csvOutput.write(String.valueOf((i+1)));
//csvOutput.endRecord();
}
csvOutput.write(String.valueOf((i+1)));
csvOutput.endRecord();

}
csvOutput.close();
wb.close();
return new File(newname);
}catch(Exception e){
e.printStackTrace();
return null;

}
}
return null;
}
public boolean insertIntoDb(File f){
if(f==null)
return false;
else{
String path=f.getAbsolutePath();
Connection conn=null;
Statement stmt=null;
try{
//System.out.println("Hello 1");
Class.forName("oracle.jdbc.driver.OracleDriver");
//System.out.println("Hello 2");

conn=(Connection) DriverManager.getConnection(
"jdbc:oracle:thin:@adress:orcl","almit","password");
//System.out.println("Hello 3");

stmt=conn.createStatement();
//System.out.println("Hello 4");

/*
* query = "LOAD DATA INFILE '"+filename+"' INTO TABLE testtable FIELDS
* TERMINATED BY ',' (text,price)";
*/
String select1="truncate table almit.TEMP_FOR_WORK";
//System.out.println("Hello 5");
stmt.execute(select1);
//System.out.println("Hello");
String select="LOAD DATA local INFILE '"+path+"' INTO TABLE TEMP_FOR_WORK FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'";
//System.out.println(select);
stmt.executeUpdate(select);
//System.out.println("Hello");

}catch(Exception e){
e.printStackTrace();
return false;
}finally{
try{
if(conn!=null)
conn.close();
if(stmt!=null)
stmt.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
return true;
}

}

我尝试了其他方法,但它们都输出到一列。我得到的结果是 |colomun1| |客户编号、id|我想要得到的结果|第1列|第2列| |客户|id|

这可能吗?提前致谢!

最佳答案

部分问题可能是这样的:

以“\n”结尾的行

这在 Mac(Unix 机器)中是正确的,但是在 Windows 中,行以“\r\n”终止。

在我看来,您可以从 XSL 文件中提取 XML 数据并对 XML 文档进行解析并插入节点,而不是执行到 CSV 的转换。可能需要做更多的工作,但这将使您的应用程序平台独立。

祝你好运。

关于java - 如何将数据写入 csv 文件中的单独列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com