2009-11-18 2 views
1

У меня возникла большая проблема с записью значений в новый CSV-файл.Проблема с строками и столбцами из CSV

Получаю файл csv, из которого я разбираю все значения. Это прекрасно работает, я привел это и поставил его в datagridview.

Первое, что мы хотим сделать с этим файлом, - это переустановить его. Как бы то ни было, есть два набора заголовков: один сверху, один слева. В принципе, мы хотим, чтобы это было наоборот: поместите заголовки слева на верх, а заголовки сверху, чтобы проложить путь к файлу.

Что происходит, однако, заключается в том, что следующий код создает CSV, который имеет одну строку (которая правильная) с правильным количеством столбцов (вместо строк, снова правильная) ... однако все значения для таблица являются "1, 1, 1, 1, 1, 1, 1, 1, 1, 1" и т.д.

EG:

Я получить файл, как так:

файл :, 1, 2, 3, 4, 5

тип a, 9%, 10%, 11%, 12%, 13%

типа B, 9%, 10%, 11%, 12%, 13%

типа с, 9%, 10%, 11%, 12%, 13%

типа д, 9% , 10%, 11%, 12%, 13%

хочу сделать его следующим образом:

Файл :, типа а, тип B, тип C, тип д

1, 9%, 9%, 9%, 9%

2, 10%, 10%, 10%, 10%

3, 11%, 11%, 11%, 11%

4, 12%, 12%, 12%, 12%

5, 13%, 13%, 13%, 13%

Вот код, который я до сих пор:

if (!File.Exists(path)) 
      return null; 

     string full = Path.GetFullPath(path); 
     string file = Path.GetFileName(full); 
     string dir = Path.GetDirectoryName(full); 

     //create the "database" connection string 
     string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" 
      + "Data Source=\"" + dir + "\\\";" 
      + "Extended Properties=\"text;HDR=No;FMT=Delimited\""; 

     //create the database query 
     string query = "SELECT * FROM [" + file + "]"; 

     //create a DataTable to hold the query results 
     DataTable dTable = new DataTable(); 

     //create an OleDbDataAdapter to execute the query 
     OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString); 

     //Get the CSV file to change position. 


     try 
     { 
      //fill the DataTable 
      dAdapter.Fill(dTable); 

      string activedir = dir; 
      //Now write in new format. 
      StreamWriter sw = new StreamWriter(File.Create(dir + "\\modified_" + file.ToString())); 
      int iRowCount = dTable.Rows.Count; 
      foreach(DataRow dr in dTable.Rows) 
      { 
       string writeVal = (string)dTable.Columns[0].ToString(); 
       sw.Write(writeVal); 
       sw.Write(","); 
      } 
      sw.Write(sw.NewLine); 

      sw.Close(); 
      dAdapter.Dispose(); 

     } 
     catch (InvalidOperationException /*e*/) 
     { } 

     string newPath = dir + "\\modified_" + file.ToString(); 

     if (!File.Exists(newPath)) 
      return null; 

     string f = Path.GetFullPath(newPath); 
     string fi = Path.GetFileName(f); 
     string di = Path.GetDirectoryName(f); 

     //create the "database" connection string 
     string conn = "Provider=Microsoft.Jet.OLEDB.4.0;" 
      + "Data Source=\"" + di + "\\\";" 
      + "Extended Properties=\"text;HDR=No;FMT=Delimited\""; 

     //create the database query 
     string q = "SELECT * FROM [" + fi + "]"; 

     //create a DataTable to hold the query results 
     DataTable dTe = new DataTable(); 

     //create an OleDbDataAdapter to execute the query 
     OleDbDataAdapter dA = new OleDbDataAdapter(q, connString); 

     //Get the CSV file to change position. 


     try 
     { 
      //fill the DataTable 
      dA.Fill(dTe); 

     } 
     catch (InvalidOperationException /*e*/) 
     { } 

     return dTe; 

Любая помощь?

Спасибо!

+0

Смотрите итератор, вы повторяете только строки, а не столбцы. – Saar

+0

Где я это ищу? –

+0

nvm, получил это спасибо! Не могли бы вы сделать быстрый комментарий, чтобы я мог ответить на вопрос?Изменена линия «string writeVal = ...» до объект writeVal = dr [0]; –

ответ

1

Измененный файл, так что "строка writeVal = ..."

теперь

объект writeVal = др [0];

0

Я считаю, что вы ищете перенос данных. See this для быстрого переноса данных.

Смежные вопросы