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

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

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

但这是行不通的,没有任何内容插入数据库。

为了在表的第二和第四(nullsrccnt)列中插入verticle值,必须对上述程序进行哪些修改?

最佳答案

StringTokenizer将连续的定界符视为单个定界符。您说输入包含[制表符空格]作为定界符,但是您的其余代码似乎没有期望空格,因此,如果没有更多信息,我将猜测输入仅由制表符分隔(而不是[制表符]空格]),并忽略相邻的定界符,然后最后一个nextToken()会引发一个您正在忽略的异常。

答案是按照Javadoc中的建议使用split()重写它


StringTokenizer是一个遗留类,
出于兼容性原因保留
尽管在新版本中不鼓励使用
码。建议任何人
寻求此功能使用
String的split方法或
改为使用java.util.regex软件包。


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

关于java - 从CSV文件读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4191201/

10-16 12:12