使用opencsv在Java中创建CSV文件的问题

问题描述 投票:0回答:1

我正在尝试通过Java线程将数据库中的数据写入到csv文件中。为了写作,我正在使用OPENCSV jar。我面临的问题是,有时csv文件中的值会损坏,如下面的第1行和第4行所示。我不知道为什么会这样。来自数据库的值都可以(在日志中可以看到),但在csv文件中则不能。

[E[EcoUnit 01]  [Segment B/1]   [2017-12-29 22:13:23.047]   [ventilation air humidity]  [70.18]
[EcoUnit 01]    [Segment B/1]   [2017-10-25 22:21:36.583]   [ventilation air humidity]  [69.65]
[EcoUnit 01]    [Segment B/1]   [2017-10-25 22:22:36.59]    [ventilation air humidity]  [69.33]
[EcoUnit 01]    [Segment B/017-11-14 12:02:48.013]  [ventilation fan]   [30]    

如果有人可以让我建议发生这种情况的原因,我将非常感激。代码如下:-


List<String> values = new ArrayList<String>();
                    fw = new FileWriter(file);
                    writer = new CSVWriter(fw); 
                    writer.writeNext(headers);
                    values.add(doc.getFieldValue("Unit_Label").toString());
                    values.add(doc.getFieldValue("Segment_Label").toString());
                    values.add("[" + doc.getFieldValue("datestring").toString() + "]");
                    values.add(doc.getFieldValue("Item_Label").toString());
                    values.add(doc.getFieldValue("Value").toString());
                    writer.writeNext(values.toArray(new String[]{}));

添加负责创建文件并写入文件的功能的完整代码。

public void createAndFillFile(String startDateStr, String endDateStr, int fileNumber,SolrDocumentList results){
        try{
            String startDateParts[] = startDateStr.split(" ");
            String startDate  = startDateParts[0];
            String endDateParts[] = endDateStr.split(" ");
            String endDate  = endDateParts[0];
            if(fileNumber == 1){

                Date date = new Date() ;
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss") ;

                String currentDate = dateFormat.format(date); //This line can be removed and in below line directly can be used
                zipFile = currentDate + ".zip";

                dir = new File("C:" + File.separator + "EcotronDownloadable" + File.separator + currentDate);


                dir.mkdir();

                path = dir.getAbsolutePath() + File.separator ;
                file = new File(path+ startDate + "_" + endDate + "_" + fileNumber + ".csv");
                fw = new FileWriter(file);
                writer = new CSVWriter(fw);
                writer.writeNext(headers);

            }
            synchronized(file){
            for (SolrDocument doc : results) {
                List<String> values = new ArrayList<String>();
                Thread.sleep(1);
                long fileLength = file.length();
                if(fileLength<maxFileSize){
                    values.add(doc.getFieldValue("Unit_Label").toString());
                    values.add(doc.getFieldValue("Segment_Label").toString());
                    values.add("[" + doc.getFieldValue("datestring").toString() + "]");
                    values.add(doc.getFieldValue("Item_Label").toString());
                    values.add(doc.getFieldValue("Value").toString());
                    //log.trace(values);
                    writer.writeNext(values.toArray(new String[]{}));
                }
                else{
                    fw.flush();
                    fw.close();
//                  writer.close();
                    j = j + 1;
                    file = new File(path + startDate + "_" + endDate  + "_" + j + ".csv") ;
                    fw = new FileWriter(file);
                    writer = new CSVWriter(fw); 
                    writer.writeNext(headers);
                    values.add(doc.getFieldValue("Unit_Label").toString());
                    values.add(doc.getFieldValue("Segment_Label").toString());
                    values.add("[" + doc.getFieldValue("datestring").toString() + "]");
                    values.add(doc.getFieldValue("Item_Label").toString());
                    values.add(doc.getFieldValue("Value").toString());
                    //log.trace(values);
                    writer.writeNext(values.toArray(new String[]{}));

                }
            }
            }

//          fw.flush();
//          fw.close();
//          writer.close();

        }
        catch (Exception e) {

            e.printStackTrace();
        }

    }

``
java csv opencsv
1个回答
0
投票

您可能有两个FileWriter实例(在不同的线程中)指向同一文件并同时写入。

尝试一下:

    synchronized (file)
    {
        List<String> values = new ArrayList<String>();
        fw = new FileWriter(file);
        writer = new CSVWriter(fw);
        writer.writeNext(headers);
        values.add(doc.getFieldValue("Unit_Label").toString());
        values.add(doc.getFieldValue("Segment_Label").toString());
        values.add("[" + doc.getFieldValue("datestring").toString() + "]");
        values.add(doc.getFieldValue("Item_Label").toString());
        values.add(doc.getFieldValue("Value").toString());
        writer.writeNext(values.toArray(new String[]{}));
    }
© www.soinside.com 2019 - 2024. All rights reserved.