从CSV文件中读取

时间:2010-11-16 04:21:44

标签: java csv

try {
    BufferedReader br = new BufferedReader(new InputStreamReader(item.getInputStream()));
    String strLine = "";
    StringTokenizer st = null;
    while ((strLine = br.readLine()) != null) {
        st = new StringTokenizer(strLine, "\t");
        while (st.hasMoreTokens()) {
            urlcnt = st.nextToken();
            srccnt = st.nextToken();
            contentType = st.nextToken();
            verticle = st.nextToken();
            timeFrame = st.nextToken();
        }
        if (con == null) {
            SQLConnection.setURL("jdbc:sqlserver://192.168.2.53\\SQL2005;user=sa;password=365media;DatabaseName=LN_ADWEEK");
            con = SQLConnection.getNewConnection();
            stmt = con.createStatement();
        }
        try {
            ResultSet rs;
            boolean hasRows = false;
            rs = stmt.executeQuery("select url from urls_temp where url='"+urlcnt+"'");
            while (rs.next()) {
                hasRows=true;
                i++;
            }
            if (!hasRows) {
                j++;
                PreparedStatement insertUrlStatement = con.prepareStatement("INSERT INTO urls_temp(url, source_name, is_active, is_periodic, Link_Type, New_Entry, verticle, periodic_timeframe) VALUES(?, ?, ?, ?, ?, ?, ?, ?)");
                if (timeFrame.equalsIgnoreCase("Daily")) {
                    insertUrlStatement.setString(1, urlcnt);
                    insertUrlStatement.setString(2, srccnt);
                    insertUrlStatement.setInt(3, 1);
                    insertUrlStatement.setInt(4, 0);
                    insertUrlStatement.setString(5, contentType);
                    insertUrlStatement.setInt(6, 1);
                    insertUrlStatement.setString(7, verticle);
                    insertUrlStatement.setString(8, timeFrame);
                    insertUrlStatement.executeUpdate();
                    insertUrlStatement.close();
                } else {
                    insertUrlStatement.setString(1, urlcnt);
                    insertUrlStatement.setString(2, srccnt);
                    insertUrlStatement.setInt(3, 1);
                    insertUrlStatement.setInt(4, 1);
                    insertUrlStatement.setString(5, contentType);
                    insertUrlStatement.setInt(6, 1);
                    insertUrlStatement.setString(7, verticle);
                    insertUrlStatement.setString(8, timeFrame);
                    insertUrlStatement.executeUpdate();
                }
            }
        }
    }
}

以上代码用于将详细信息上传到数据库,这些数据库以CSV文件分隔。

CSV文件的样本格式如下,这样可以正常工作:

http://avb.com(tab space)asdf(tab space)asdf(tab space)asdd(tab space)asdf

http://anything.com(tab space)asdf(tab space)asdf(tab space)asdfasd(tab space)asdfsadf

有时我可能需要从CSV文件中将一些null值插入数据库,如下所示:

http://asdf.com(tab space)(tab space)aasddf(tab space)(tab space)asdfsad

但这不起作用,没有任何东西插入数据库。

对于在表格的第二个和第四个(null& srccnt)列中插入verticle值的上述程序,必须进行哪些修改?

3 个答案:

答案 0 :(得分:1)

StringTokenizer将连续分隔符视为单个分隔符。你说输入包含[tab space]作为分隔符,但你的代码的其余部分似乎并不期望空格,所以没有更多信息,我猜测输入只用标签分隔(不是[tab]空格]),并忽略相邻的分隔符,然后最后nextToken()抛出一个你忽略的异常。

这里的答案是根据Javadoc

中的建议,使用split()重写此内容
  

StringTokenizer是一个遗留类   因兼容性原因而保留   虽然在新的情况下不鼓励使用它   码。任何人都可以推荐   寻求此功能使用   分裂方法的String或   而是java.util.regex包。

也就是说,您应该查看任何现有的CSV库(Google for Java CSV)。

答案 1 :(得分:0)

我建议你调试你的代码,以便更具体地找出它不符合预期的行为,然后,如果有必要,发布一个更具体的问题。

答案 2 :(得分:0)

我使用FileHelpers来解析csv文件。 http://www.filehelpers.com/。它读取一个csv文件,并在对象中给出一个输出,这是我想要的。而且,如果我传递对象列表,它将为我创建一个csv文件。给它一个机会。