我想逐行读取文本文件中的数据,并将数据插入数据库的每一行。
我现在想的是逐行阅读并在每行插入数据库。我在这里问的是有更好的主意吗?比如我们可以做什么来一次插入数据而不是逐行循环并插入记录?我在每天需要存储的文本文件中有大约500行,所以性能是我的问题。
请注意,我需要在数据库中将每行插入一行。数据以逗号分隔,因此我需要拆分它们并将它们插入特定列。
任何建议?
答案 0 :(得分:3)
Imports System
Imports System.IO
Imports System.Collections
Module Module1
Sub Main()
Dim objReader As New StreamReader("c:\test.txt")
Dim sLine As String = ""
Dim arrText As New ArrayList()
Do
sLine = objReader.ReadLine()
If Not sLine Is Nothing Then
arrText.Add(sLine)
End If
Loop Until sLine Is Nothing
objReader.Close()
Using command As New SqlCeCommand("INSERT INTO table(col1) VALUES(@data1)", Con)
command.Parameters.AddWithValue("@data1", "")
For Each sLine In arrText
command.Parameters("@data1").Value = sLine
command.ExecuteNonQuery()
Next
End Using
End Sub
End Module
答案 1 :(得分:1)
您可以先将文本文件放入数据表中(因为它是基于内存的,并且没有任何循环访问服务器而导致数据表不会出现任何性能问题),而是使用Bulkcopy功能将其插入数据库。我假设数据将被插入SQL Server数据库。您可以在此处使用SQLBulkCopy示例代码:
private void BulkInsert()
{
SqlBulkCopy bulkCopy = new SqlBulkCopy("Server=ServerName;Database=test;Trusted_Connection=True;",
SqlBulkCopyOptions.TableLock);
bulkCopy.DestinationTableName = "target_table";
bulkCopy.WriteToServer(Text2Table());
}
private DataTable Text2Table()
{
DataTable dt = new DataTable();
StreamReader sr = new StreamReader(@"c:\test\test.txt");
string input;
while ((inrecord = sr.ReadLine()) != null)
{
string[] values = inrecord.Split(new char[] { '|' });
dr = dt.NewRow();
dr["column1"] = values[0];
dr["column2"] = values[1];
dr["column3"] = values[2];
dr["column4"] = values[3];
dt.Rows.Add(dr);
}
sr.Close();
return dt;
}
答案 2 :(得分:0)
我觉得这很容易。
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ScannerReadFile {
public static void main(String[] args) {
FileInputStream fstream = new FileInputStream("textfile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
int row =0;
int col;
while ((strLine = br.readLine()) != null) {
Scanner scanner = new Scanner(strLine);
String token="";
while(scanner.hasNext()){
token = scanner.next();
for(int i = 0; i<token.length();i++){
if(token.charAt(i)!=','){
record += token.charAt(i);
}
else{
insert into table values ( record )
record = "";
}
}
row++;
} }
答案 3 :(得分:0)
性能问题是由于正常插入数据库 - 而不是因为读取文件。
为了解决这个问题,我建议你使用strongtyped数据表 - 因为你只是插入,只是在这个.Net数据表中添加新行,最后一次性将它提交给DB(使用SqlDataAdapter)
关于阅读文件,我建议你使用现有的vb.net库:Microsoft.VisualBasic.FileIo.TextFiledParser(ref:http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(v=vs.110).aspx)。
当然,你有另一个选择,而不是使用DataTable,生成纯文本SQL插入查询会执行得更好,输出查询将如下:
INSERT INTO tblTarget(Id, Col1, Col2)
Values (1, 'Row1.Val1', 'Row1.Val2'),
(2, 'Row2.Val1', 'Row2.Val2'),
(3, 'Row3.Val1', 'Row3.Val2'),
(4, 'Row4.Val1', 'Row4.Val2'),
...
希望它有所帮助...