如何解析java中具有一些空值的csv文件

时间:2011-11-27 12:52:25

标签: java csv

我想解析csv如下:

  

上午12:50,11.0,10.0,94,1013,10.0,NNW,14.8, - ,N / A ,,主要是   多云,330,2011-10-27 23:50:00

解析它我使用如下代码:

while((mylines = rdr.readLine()) != null)
        {   
            Pattern p = Pattern.compile("<br />");
            mylines=mylines.replaceAll("<br />", "");
            System.out.println(mylines);
            StringTokenizer st = new StringTokenizer(mylines , ",");
            while(st.hasMoreTokens())
            {
                System.out.println(st.nextToken());
            }
        }

对于我称之为Null的第10个元素我没有得到任何不好的令牌响应。 我怎样才能获得所有元素的标记?

问候

6 个答案:

答案 0 :(得分:3)

这是StringTokenizer类的预期行为。 您可以通过在拆分字符串之前添加以下行来强制程序返回一些内容"***",例如空标记:

mylines=mylines.replaceAll(",,", ",***,");

在这种情况下,StringTokenizer将返回***而不是null

答案 1 :(得分:1)

如果您习惯使用第三方库,请使用Apache的commons-lang并尝试StringUtils.splitPreserveAllTokens() - 请参阅the API doc

答案 2 :(得分:0)

在第十个位置,您有,,,这是一个空字符串,在Java中由空值表示。为避免打印空值,请执行类似

的操作
String str;
if((str = st.nextToken())!=null) {
  System.out.println(str);
} else {
  //print nothing or maybe a newline
}

答案 3 :(得分:0)

嗨,这是一个简单的测试用例,它解析该行并为您提供所有元素,包括空元素:

package com.sg2net.test;

public class TestSplit {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String[] data="12:50 AM,11.0,10.0,94,1013,10.0,NNW,14.8,-,N/A,,Mostly Cloudy,330,2011-10-27 23:50:00§".split(",");
        //String[] data="valore##valore1".split("##");
        System.out.println(data.length);
        if (data.length>0) {
            int i=1;
            for (String element : data) {
                if (element==null || element.length()==0) {
                    System.out.println("empty element at position " + i);
                }
                System.out.println(element);
                i++;
            }
        }

    }

}

答案 4 :(得分:0)

而不是null,查找长度为&gt;的标记。 0.在Java中,值null与空字符串不同。

答案 5 :(得分:0)

ostermiller.org有一个jar,有很好的实用工具类,如CSV-Parser/Writer等。