2016-10-19 1 views
0

J'ai essayé depuis un certain temps maintenant d'exporter une table de données à CSV en studio visuel après l'enregistrement de données.Streamwriter ajoutant des sauts de ligne supplémentaires au hasard lors de l'exportation de Visual Studio à CSV C#

Pour une raison quelconque, je reçois des résultats bizarres lors de l'importation dans Excel alors que le bloc-notes est très bien. Il semble que des sauts de ligne sont ajoutés mais à des points aléatoires dans les données. Je me bats depuis un moment maintenant, donc toute aide est appréciée!

Excel Version

Notepad Version

void SaveAllData() 
    { 
     { 
      saveFileDialog1.InitialDirectory = "C"; // open save file window 
      saveFileDialog1.Title = "Save as CSV File"; // promt save as csv 
      saveFileDialog1.FileName = DateTime.Now.ToString("dd.MM.yy_HH.mm"); 
      saveFileDialog1.Filter = "CSV File | *.csv"; // csv format 

      if (saveFileDialog1.ShowDialog() != DialogResult.Cancel) // if save dialog opens 
      { 
       string value = ""; 
       DataGridViewRow dr = new DataGridViewRow(); 
       StreamWriter swOut = new StreamWriter(saveFileDialog1.FileName, true, Encoding.ASCII); 

       //write header rows to csv 
       for (int i = 0; i <= IncomingDataTable.Columns.Count - 1; i++) 
       { 
        if (i > 0) 
        { 
         swOut.Write(","); 
        } 
        swOut.Write(IncomingDataTable.Columns[i].HeaderText); 
       } 

       swOut.WriteLine(); 

       //write DataGridView rows to csv 
       for (int j = 0; j <= IncomingDataTable.Rows.Count - 1; j++) 
       { 
        if (j > 0) 
        { 
         swOut.WriteLine(); 
        } 
        dr = IncomingDataTable.Rows[j]; 

        for (int i = 0; i <= IncomingDataTable.Columns.Count - 1; i++) 
        { 
         if (i > 0) 
         { 
          swOut.Write(","); 

         } 

         value = dr.Cells[i].Value.ToString(); 
         swOut.Write(value); 

        } 
       } 
       swOut.Close(); 
      } 

    MessageBox.Show("Your data has been successfully saved.", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information); // alert user file has saved 



      serialPort1.Close(); // close serial port 
      Setup_Page f1 = new Setup_Page(); // open setup page 
      this.Hide(); 
      f1.ShowDialog(); 
      Close(); // close this page 
     } 
    } 
+0

Il existe des bibliothèques qui le font pour vous: https://www.nuget.org/packages/CsvHelper/ – Magnus

+0

@Magnus Mon problème n'est pas l'exportation en tant que fichier CSV, mais lors de l'exportation, j'obtiens des sauts de ligne dans mes données. – charley

+0

Vos données entrantes contiennent-elles des sauts de ligne? Essayez d'ouvrir le fichier CSV dans WordPad à la place du Bloc-notes, car WordPad se casse à la ligne, mais pas le Bloc-notes. Si c'est le problème, coupez toutes vos données entrantes avant de l'écrire. – Lithis

Répondre

0

Si vos données d'entrée contient des sauts de ligne et que vous les sortie, certaines applications les traiter comme des sauts de ligne, mais d'autres non. Le Bloc-notes ne fonctionne pas, il ressemble donc à une seule ligne dans le Bloc-notes. Excel reconnaît les sauts de ligne et commence une nouvelle ligne. Ouvrez le fichier CSV dans WordPad au lieu du Bloc-notes; WordPad reconnaît les sauts de ligne alors qu'ils sont invisibles dans le Bloc-notes.

Le correctif simple consiste à appeler String.Trim sur vos données d'entrée avant de l'écrire. Cependant, comme Magnus l'a mentionné, les bibliothèques sont votre ami. Si vous en avez utilisé un bon, cela n'a peut-être pas été un problème en premier lieu, car une bibliothèque bien écrite aurait traité les nouvelles lignes incorporées dans les données.

Vous pouvez dire que vous pouvez couper les nouvelles lignes. Eh bien, que se passe-t-il si un saut de ligne est au milieu de vos données? Trim ne gérera pas cela. Il n'y aura pas de nouvelle ligne? Qu'en est-il des virgules? Il n'y aura pas de virgules, car les données sont uniquement numériques? Que se passe-t-il s'il s'agit d'une décimale, et que l'ordinateur qui l'a produite est en France, ou de nombreux autres pays qui utilisent la virgule comme séparateur décimal? Qu'en est-il des citations dans les données? Une bibliothèque peut avoir déjà traité tous ces cas. (Le séparateur décimal virgule peut toujours poser un problème à quiconque utilise la sortie, mais au moins le CSV sera bien formé.)

Notez cependant que CSV n'est pas une norme bien définie. Différentes applications et bibliothèques utilisent des stratégies différentes pour gérer les cas ci-dessus. Par conséquent, si votre bibliothèque n'utilise pas le même format qu'Excel, elle risque de ne pas se charger correctement.