簡體   English   中英

如何使用 Java 讀取 .csv 文件並將其數據插入 SQL Server?

[英]How do I use Java to read a .csv file and insert its data into SQL Server?

我對Java很陌生。 我有一個包含兩個步驟的任務。

  1. 我想從.csv文件中讀取所有數據。
  2. 讀取該數據后,我必須將其放入 SQL Server 數據庫中。

我已經完成了第一步。 我能夠讀取.csv文件數據,但我不知道如何將其插入數據庫。

這是我獲取.csv文件數據的代碼:

import java.io.BufferedReader;  
import java.io.FileNotFoundException;  
import java.io.FileReader;  
import java.io.IOException;  
import java.util.StringTokenizer;  


public class DBcvsdataextractor {  

    /** 
     * @param args 
    */  
    public static void main(String[] args) { 
        // TODO Auto-generated method stub  

        String fileName="D:/USPresident Wikipedia URLs Thumbs HS.csv";  

        try {    
        BufferedReader br = new BufferedReader( new FileReader(fileName));    
            StringTokenizer st = null;    
            int lineNumber = 0, tokenNumber = 0;    

            while( (fileName = br.readLine()) != null)    
            {    

                if(lineNumber++ == 0)  
                   continue;                  

                //break comma separated line using ","    
                st = new StringTokenizer(fileName, ",");    

                while(st.hasMoreTokens())    
                {    
                    //display csv values    
                    tokenNumber++;    
                    System.out.print(st.nextToken() + '\t'); 
                }    

                //new line    
                System.out.println(" ");    

                //reset token number    
                tokenNumber = 0;    

            }    
        } catch (FileNotFoundException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        } catch (IOException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        }
    }
}

現在,我如何將該數據插入到 SQL Server 中?

SQL Server 為此提供了一個工具。

像這樣:

BULK INSERT CSVTest
FROM 'c:\csvtest.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)

例如,在您的 java 中使用此命令,使用 JDBC 連接。

希望這可以幫助。

SQL Server 文件 CSV

如果你真的想用 Java 做到這一點,並且真的想像現在一樣編寫自己的 CSV 解析器,你可以

  1. 您不必打印出每個“CSV 文件值”,而是必須存儲它們。 例如,您可以對 CSV 文件中的每一列使用ArrayList ,並在讀取 CSV 文件時填充這些列
  2. 一旦文件被讀取,你可以遍歷這些ArrayList情況下,再構建一個大的INSERT對所有數據的語句,或者一個INSERT為您在CSV文件中遇到的每一行語句。 如果您選擇最后一個選項,則甚至不需要使用那些ArrayList實例。 在這種情況下,您可以在讀取 CSV 文件時構造一個單獨的INSERT語句,並在每次讀取一行后將其提交給數據庫。

我知道如果您想使用一個大的INSERT語句,在讀取 CSV 文件時構建查詢的方法也是可能的,但是將INSERT與讀取 CSV 文件分開具有很大的優勢,您可以替換自己的 CSV解析器稍后由標准解析器使用,沒有太多麻煩。

您可以自定義以下類以將數據插入 sql server。

文件導入CSV.java

package com.example.demo;

import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import com.opencsv.CSVReader;

public class ImportCsv
{
    public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException
    {
            readCsv();
    }

    private static void readCsv() throws UnsupportedEncodingException, FileNotFoundException
    {
        Reader readerstream = new InputStreamReader(new FileInputStream("D:\\file.csv"), "Unicode");
            try (CSVReader reader = new CSVReader(readerstream, ',');
                    
                    Connection connection = DBConnection.getConnection();)
            {
                    String insertQuery = "Insert into [dbo].[tableName] ([Column1],[Column2],[Column3], [Column4],...[Column8]") values (?,?,?,?,?,?,?,?)";
                    PreparedStatement pstmt = connection.prepareStatement(insertQuery);
                    
                    String[] rowData = null;
                    int i = 0;
                    while((rowData = reader.readNext()) != null){
                    for (String data : rowData)
                    {
                        //System.out.println(new String(data.replace(" ","")));
                        String strLine = new String(data.replace(" ",""));
                        String[] splited = strLine.split("\\s+");
                        

                            pstmt.setNString(1, splited[0]);
                            pstmt.setNString(2, splited[1]);
                            pstmt.setNString(3, splited[2]);
                            pstmt.setNString(4, splited[3]);
                            pstmt.setNString(5, splited[4]);
                            pstmt.setNString(6, splited[5]);
                            pstmt.setNString(7, splited[6]);
                            try {
                            pstmt.setNString(8, splited[7]);
                            }catch(Exception e) {
                                
                            }
                            if (++i % 8 == 0) {
                                    pstmt.addBatch();// add batch
                            }
                            if (i % 80 == 0) {// insert when the batch size is 10
                                    pstmt.executeBatch();
                            }
                    }}
                    System.out.println("Data Successfully Uploaded");
            }
            catch (Exception e)
            {
                    e.printStackTrace();
            }

    }
  }

數據庫連接程序

package com.example.demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {

static {

    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static Connection getConnection() throws SQLException {
 String url = "jdbc:sqlserver://localhost:1433;" +
      "databasename=myDBName;user=user;password=pwd;sendStringParametersAsUnicode=true;";    
 Connection con =DriverManager.getConnection(url);
    return con;

}


}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM