2011-03-17 2 views
0

J'ai un problème pour enregistrer des données dans un fichier .csv.enregistrer les données dans le fichier csv

 void WriteLog(DataRow rzad) 
    { 
      StreamWriter sw = new StreamWriter("log.csv", true); 
      int iColCount = 8; 

      for (int i = 0; i < iColCount; i++) 
      { 
       if (!Convert.IsDBNull(rzad[i])) 
       { 
        sw.Write(rzad[i].ToString()); 
        sw.Write("\t"); 
       } 
      } 
      sw.Write("\n"); 
      sw.Flush(); 
      sw.Close(); 
    } 

Le problème est de prendre dans le fichier J'ai des données dans une colonne. Je veux casser une rangée dans le format DataRow à 8 parties, qui sont mises dans 8 colonnes différentes. Ma fonction fonctionne comme elle ne voit pas l'onglet ("\ t").

Je ne peux pas publier des images, donc je tente de décrire les résultats dans un fichier csv:

2011-03-17 14:34:11asdPrzekroczono krytyczną minimalną wymaganą wartość parametru5010050080550 

Ceci est mon exemple ligne et je veux briser 8 colonnes:

2011-03-17 14:34:11  asd  Przekroczono krytyczną minimalną wymaganą wartość parametru 50  100 500  80  550  

« # \ t # "n'aide pas. Les résultats sont:

"2011-03-17 18:29:17# #asd# #Przekroczono krytyczną, maksymalną, wymaganą wartość parametru# #560# #100# #500# #80# #550# #" 

Il y a une tabulation, mais mon point est que a fait pas d'espace, mais une transition vers la cellule suivante :(

« \ u0008 » n'aide pas

+1

Pouvez-vous nous montrer ce qu'est exactement la sortie, s'il vous plaît? –

+0

Et un morceau complet de code exécutable. Puisque votre fonction semble correcte. – Hossein

+0

Cela peut être un problème d'encodage. essayez ** sw.Write ("\ u0008") ** et voyez si cela fonctionne. Sinon, essayez de changer ** sw.Write ("\ t") ** en ** sw.Write ("# \ t #") ** et de voir s'il écrit le #s? – Hossein

Répondre

1
.

d'abord, vous dites que vous écrivez dans un fichier CSV (valeurs séparées par des virgules) Mais, vous écrivez vraiment à un fichier délimité par des tabulations Et, vous devez écrire/r/n entre les lignes:..

Cela fonctionne:

StreamWriter sw = new StreamWriter(@"c:\log.csv", true); 
    int iColCount = 8; 
    for (int i = 0; i < iColCount; i++) 
    {   
     { 
      sw.Write(i.ToString()); 
      sw.Write("\t"); 
     } 
    } 
    sw.Write("\r\n"); 
    sw.Flush(); 
    sw.Close(); 
+0

cela ne fonctionne pas :( – piwowarczyk85

0

Je suis enclin à accepter @ Hossein. Je pense que c'est un problème d'encodage. J'ai exécuté votre code exactement comme il est sur ma machine, et cela a fonctionné parfaitement.

+0

Alors, comment il devrait être? – piwowarczyk85

+0

Malheureusement, je ne peux pas vous aider. Je n'ai pas à faire face à tout problème d'encodage où je travaille. –

0

Juste si vous avez toujours pas trouvé une solution depuis que vous avez écrit cette question il y a un an:

Vous pouvez utiliser la bibliothèque KBCSV qui est très populaire et gère à peu près tout dont vous avez besoin. Il utilise csv par défaut mais peut être facilement modifié pour gérer tsv.

Pour une solution très simple et facilement cassables, vous pouvez essayer: string.join ("\ t", rzad) + "\ r \ n"

Cela ne prendrait pas en compte les champs qui contiennent des onglets . Si un champ contient un onglet, cela rendra cette méthode inutile. Les champs qui contiennent le délimiteur sont généralement des guillemets doubles et les champs qui contiennent des guillemets doubles sont des guillemets doubles.

Ce n'est pas trop difficile à implémenter, mais ça réinvente la roue comme ça Kent Boogart a déjà passé de nombreuses heures à prendre en considération quelques-unes des carrefours que je ne connaissais pas.

0

La fonction suivante est utilisée pour écrire le fichier csv.

public static void WriteCSV(string file, string content) 
{ 
    using (StreamWriter sw = new StreamWriter(file)) 
    { 
     sw.Write(content); 
    } 
} 

Ensuite, appelez cette fonction par

string appendText = ""; 
for (int i = 0; i < iColCount; i++) 
{ 
    if (!Convert.IsDBNull(rzad[i])) 
    { 
     appendText += appendText == "" ? rzad[i].toString() : "," + rzad[i].toString(); 
    } 
} 
WriteCSV("C:\\out\\out.csv",appendText); 

Un autre exemple simple pour plusieurs lignes, chaque ligne est séparée par un caractère de nouvelle ligne « \ n ».

WriteCSV("C:\\out\\out.csv","a,b,c,d,e,f,g\nh,i,j,k,l,m,n\n"); 
Questions connexes