2013-03-03 2 views
2

나는 C#을 통해 파일을 읽었으며 파일 형식은 다음과 같습니다.텍스트 파일을 mysql 데이터베이스에 저장하십시오. C#

00001740,  0.125,  0,  able 
00001740,  0.125,  0,  unable 
00002098,  0,   0.75, country 
00002312,  0,   0,  love  


입력 파일은 내가 MySQL 데이터베이스에서이 파일을합니다. 데이터베이스의 각 행에 각 행을 저장하는 코드를 작성합니다. 하지만 다음 코드 WRITE 텍스트의 첫 번째 라인은

private void button1_Click(object sender, EventArgs e) 
     { 
      string MyConString = "server=localhost;" + 
       "database=zahid;" + "password=zia;" + 
       "User Id=root;"; 
      MySqlConnection connection = new MySqlConnection(MyConString); 
      MySqlCommand command = connection.CreateCommand(); 
      MySqlDataReader Reader; 
      connection.Open(); 
      StreamReader reader = new StreamReader("D:\\out.txt"); 

      string line; 
      while ((line = reader.ReadLine()) != null) 
      { 
       string[] parts = line.Split(','); 
       command.CommandText = "insert into score(POS_ID,Pos,Neg,Word) values('" + parts[1] + "','" + parts[2] + "','" + parts[3] + "','" + parts[4] + "')"; 



       Reader = command.ExecuteReader();  
      } 
     } 

이 코드 반환에게 첫 번째 라인을 제기하지만, 내가 원하는 데이터베이스에 텍스트 파일 저장소의 모든 라인.

답변

3

이 혼란을 청소 해보십시오 사전에 감사 :

private void button1_Click(object sender, EventArgs e) 
{ 
    string[] lines = File.ReadAllLines("D:\\out.txt"); 
    foreach (var line in lines) 
    { 
     var data = line.Split(new[] { ',' }, 4); 
     int posId = int.Parse(data[0].Trim()); 
     double pos = double.Parse(data[1].Trim()); 
     double neg = double.Parse(data[2].Trim()); 
     string word = data[3].Trim(); 
     StoreRecord(posId, pos, neg, word); 
    } 
} 

private void StoreRecord(int posId, double pos, double neg, string word) 
{ 
    var conStr = "server=localhost; database=zahid; password=zia; User Id=root;"; 
    using (var connection = new MySqlConnection(conStr)) 
    using (var command = connection.CreateCommand()) 
    { 
     connection.Open(); 
     command.CommandText = 
     @"INSERT INTO score 
      (POS_ID, Pos, Neg, Word) 
      VALUES 
      (@posId, @pos, @neg, @word)"; 
     command.Parameters.AddWithValue("@posId", posId); 
     command.Parameters.AddWithValue("@pos", pos); 
     command.Parameters.AddWithValue("@neg", neg); 
     command.Parameters.AddWithValue("@word", word); 
     command.ExecuteNonQuery(); 
    } 
} 

것들주의 사항 : 전용 방법으로 데이터베이스 삽입 로직을 분리

  • 같은 장소
  • 에서 구문 분석 및 DB 삽입을하고 피하기 위해
  • using 사용법 연결 및 명령과 같은 IDisposable 리소스를 올바르게 처분하기위한 statemenets
  • 사용 중 SQL 주입을 피하기 위해 매개 변수화 된 쿼리

String.Split을 사용하지만 실제로는 실제 CSV 구문 분석기를 사용하지 않으려 고합니다.

CSV 파일이 큰 경우

당신은 한 번에 메모리에로드 방지하기 위해 한 번에 그것을 한 줄을 읽을 수 있습니다 :

private void button1_Click(object sender, EventArgs e) 
{ 
    using (var stream = File.OpenRead("D:\\out.txt")) 
    using (var reader = new StreamReader(stream)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      var data = line.Split(new[] { ',' }, 4); 
      int posId = int.Parse(data[0].Trim()); 
      double pos = double.Parse(data[1].Trim()); 
      double neg = double.Parse(data[2].Trim()); 
      string word = data[3].Trim(); 
      StoreRecord(posId, pos, neg, word); 
     } 
    } 
} 
관련 문제