【问题标题】:CSV file generated from Java adds unwanted question mark (?)从 Java 生成的 CSV 文件添加了不需要的问号 (?)
【发布时间】:2014-02-19 05:59:27
【问题描述】:

我正在从 Java 代码创建一个 CSV 文件。 (我也生成了相同的HTMLtxt 文件。问题依旧。)

代码如下。

private String writeToFile(StringBuffer csvData, long randomDigits, String type) {
    String fileName = "";
    String filePath = "";
    if ("CSV".equals(type)) {
        filePath = WebConstants.PATH + randomDigits + "CSV.csv";
        fileName = randomDigits + "CSV.csv";
    }
    try {
        BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));
        bw.write(csvData.toString());
        bw.flush();
        bw.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return fileName;
}

现在,当文件生成时,所有数据看起来都是正确的。 但是在文件末尾,有一个问号(?),这是不需要的。 我调试了代码,在调用bw.write(csvData.toString())时,csvData的值末尾不包含问号。

这就是我创建StringBuffer csvData的方式

private StringBuffer saveAsCVSFile(Vector<XYZVO> list) {

    StringBuffer csvData = new StringBuffer();
    XYZVO VO = null;
    if (list != null) {
        for (int i = 0; i < list.size(); i++) {
            VO = list.get(i);
            csvData.append(VO.getABC()+",");
            csvData.append(VO.getDEF()+",");
            csvData.append(VO.getGHI()+",");
            csvData.append(VO.getJKL()+",");
            csvData.append(VO.getMNO()+"\n");
        }
    }
    return csvData;
}

这里,XYZVO 包含所有 Stringint 变量。

我还添加了一个代码来读取生成的文件,如下所示。

private void checkFileData(String filePath) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(filePath));
            String line = null;
            while((line = br.readLine()) != null) {
                System.out.println("Line X: "+line);
            }
        } catch(FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch(IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

当我在控制台中检查此读取代码的输出时,它根本不会在末尾显示问号。

如果有人有任何想法,请告知。

【问题讨论】:

  • 我认为它存在于StringBUffer 中。您如何将数据放入其中?
  • 我正在使用for 循环从我的Vector&lt;String&gt; 附加数据。但是我在执行bw.write(csvData.toString()) 行时通过调试检查了StringBuffer 的值。我发现最后没有问号。我找到的最后一个字符是换行符。我上次添加的。
  • 您能否将完整的代码发布在Vector&lt;String&gt; 中以及如何将其放入StringBuffer 中?它与数据一直存在依赖关系
  • 可能不是问号;它可能是您的控制台无法渲染的角色。检查它的二进制值。
  • @Octopus:我已经编辑了这个问题。找到相同的代码。

标签: java csv java-io bufferedwriter stringbuffer


【解决方案1】:

当你关闭 writer 时,它会先被刷新。所以收盘前的冲洗是不必要的。尝试删除它。

【讨论】:

  • 尝试删除它。没有区别。
  • 我不确定,但可能是代码行 - csvData.append(VO.getMNO()+"\n");导致问题的原因是在字符串缓冲区的末尾有一个不必要的换行符。看看这个。
  • 我尝试了一些关于这个换行符的方法。我试图删除最后的换行符,但它只是移动了最后一行数据的问号。当出现换行符时,问号出现在下一行。
  • 这听起来可能很奇怪,但请尝试不刷新和关闭缓冲区写入器。
  • 嗯,结果很有趣。我删除了bw.flush()bw.close(),它生成的文件只有一个问号,没有其他数据。我还尝试仅删除 bw.close() 但生成的文件包含所有数据和问号。
【解决方案2】:

我使用 FileWriter 来实现同样的效果:

try
    {
    FileWriter writer=new FileWriter(csv);
    writer.append("Mobile Number");
    writer.append(',');
    writer.append("Message");
    writer.append(',');
    writer.append("Service");
    writer.append(',');
    writer.append("Time");
    writer.append('\n');


    writer.append(mobileNumber);
    writer.append(',');
    writer.append(message);
    writer.append(',');
    writer.append(service);
    writer.append(',');
    writer.append(time);
    writer.append('\n');

    writer.flush();
    writer.close();
}
catch(Exception e){
    //catch Exception here
}

使用您的代码

我使用了你的代码,但它在我的最后工作......

public static void main(String[] args) throws URISyntaxException, UnknownHostException, ClassNotFoundException{
        Test a = new Test();
        Vector<MyObject> testObj =  new Vector<MyObject>();
        testObj.add(new MyObject());
        testObj.add(new MyObject());
        testObj.add(new MyObject());
        a.checkFileData(a.writeToFile(a.saveAsCVSFile(testObj),123456789 , "CSV"));

    }


    private StringBuffer saveAsCVSFile(Vector<MyObject> list) {

        StringBuffer csvData = new StringBuffer();
        MyObject VO = null;
        if (list != null) {
            for (int i = 0; i < list.size(); i++) {
                VO = list.get(i);
                csvData.append(VO.getABC()+",");
                csvData.append(VO.getDEF()+",");
                csvData.append(VO.getGHI()+",");
                csvData.append(VO.getJKL()+",");
                csvData.append(VO.getMNO()+"\n");
            }
        }
        return csvData;
    }

    private void checkFileData(String filePath) {
        try {

            BufferedReader br = new BufferedReader(new FileReader(filePath));
            String line = null;
            while((line = br.readLine()) != null) {
                System.out.println("Line X: "+line);
            }
            br.close();
        } catch(FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch(IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }



    private String writeToFile(StringBuffer csvData, long randomDigits, String type) {
        String fileName = "";
        String filePath = "";
        if ("CSV".equals(type)) {
            filePath = randomDigits + "CSV.csv";
            fileName = randomDigits + "CSV.csv";
        }
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));
            bw.write(csvData.toString());
            bw.flush();
            bw.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return fileName;
    }


class MyObject{
    static int count =1;

    public String getABC() {
        return "ABC"+(++count);
    }

    public String getMNO() {
        return "MNO"+count;
    }

    public String getJKL() {
        return "JKL"+count;
    }

    public String getGHI() {
        return "GHI"+count;
    }

    public String getDEF() {
        return "DEF"+count;
    }
}

输出

Line X: ABC2,DEF2,GHI2,JKL2,MNO2
Line X: ABC3,DEF3,GHI3,JKL3,MNO3
Line X: ABC4,DEF4,GHI4,JKL4,MNO4

【讨论】:

  • 请再次检查问题。你提到的输出,我得到了同样的结果。问号仅在我在 Open Office 或 MS Office 中打开生成的文件时出现。
猜你喜欢
  • 2012-12-07
  • 2014-02-21
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 2016-02-02
  • 2014-04-24
  • 1970-01-01
相关资源
最近更新 更多