2017-10-18 17 views
2

Je ne sais pas pourquoi dans la dernière ligne csv les 4 dernières colonnes sont coupéesDernière ligne coupée

Peut-être que cela aide si je décris brièvement le processus. Initialement, l'application lit dans un csv, qui est sortie dans un ListView. Les ListItems individuels peuvent être sélectionnés. Pour chaque article, une heure avec la date peut être arrêtée, ceux-ci devraient alors être écrits dans le csv. Cela fonctionne dans lequel j'écrase le csv entier. Après le redémarrage de l'application apparaît seulement "exception non gérée" parce que le csv écrasé ne correspond plus à l'original. Tous les enregistrements sont ok, sauf la dernière et il y a les 4 dernières valeurs:

_Dum "+", "+" _Vo "+", "+" _Bi "+", "+" _Da "

builder.AppendLine("_Dum" + "," + "_Vo" + "," + "_Bi" + "," + "_Da" + "\r"); 

//Add Data 

foreach (var data in varModule.List) 
{ 
builder.AppendLine(data._Dum + ","); 

if (data._Stu == "B" || data._Stu == "E") 
{ 
builder.AppendLine(data._Vo + "," + data._Bi + "," + data._Dau); 
}; 

//Line Break 

builder.AppendLine("\r\n\n"); 
} 
using (StreamWriter sw = new StreamWriter(csvFilePath)) 

{ 
sw.WriteLine(builder); 
sw.Flush(); 
} 

Note: Si je ne wirte \r\n\n et double || la dernière ligne csv serait coupé plus tôt.

+1

Quelque chose semble très mauvais avec votre * retour chariot, approche de nouvelle ligne *. Pouvez-vous décrire pourquoi vous ajoutez le '' \ r \ '' '' '' '' '' '' '' '' '' '' '' 'AppendLine''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'que vous écrivez' AppendLine '? Si c'est juste une solution de contournement qui semble corrigeant quelque chose pour vous mais qui ne suit pas un problème documenté/une solution, alors nous finirions par nous raser si nous ne réparions pas cette chose en premier. – grek40

+0

Pour étendre ce que dit @ grek40, si vous voulez écrire des caractères de nouvelle ligne vous-même, utilisez 'builder.Append()' au lieu de 'builder.AppendLine()'. –

Répondre

0

Votre programme ne semble pas avoir écrit les données dont vous avez besoin. Vous vous attendez probablement la sortie suivante

_Dum,_Vo,_Bi,_Da<NewLine>

<ValueOf_Dum>,<ValueOf_Vo>,<ValueOf_Bi>,<ValueOf_Da><NewLine>

Notez que j'ai ajouté spécifiquement <NewLine> à la sortie. <NewLine> représente le (s) caractère (s) de retour à la ligne qui, selon votre système d'exploitation, est "\n" (sur les systèmes Unix) ou "\r\n" (sur les systèmes Windows). Dans .NET, il y a également Environment.NewLine, qui renvoie les caractères de nouvelle ligne spécifiques à la plate-forme. Notez qu'il n'y a pas de "standard" CSV, c'est donc votre choix avec les nouveaux caractères que vous voulez utiliser. Il semble que vous ne soyez pas clair à ce sujet, alors vous devez d'abord prendre cette décision. La prochaine chose que vous devez prendre en compte est la différence entre StringBuilder.Append et StringBuilder.AppendLine. Append ajoute simplement le texte spécifié à la fin de la chaîne, tandis que AppendLine ajoute le texte, suivi par les caractères retournés par Environment.NewLine.

Dans votre code, vous utilisez uniformément AppendLine qui ne peut pas être ce que vous voulez, puisque vous voulez évidemment construire des lignes et les ajouter dans leur ensemble. La façon dont vous le faites, vous ajoutez régulièrement de nouveaux caractères de ligne entre certaines de vos valeurs, ce qui en CSV signifie le début d'un nouvel enregistrement.

Vous ajoutez non seulement par inadvertance de nouveaux caractères de ligne à votre fichier, vous n'êtes également pas cohérent dans les caractères de nouvelle ligne que vous ajoutez manuellement. Dans la ligne de titre, vous utilisez "\r" (ce qui n'est pas OK dans Unix et dans Windows). Plus tard vous utilisez "\r\n\n" (même suivi par la nouvelle ligne ajoutée par AppendLine), qui ne fonctionne pas bien dans Unix (à cause du "\r" au début) ou dans Windows (à cause du "\n" sans un précédent "\r" à la fin).

Votre problème suivant est cette partie de votre code:

if (data._Stu == "B" || data._Stu == "E") 
{ 
    builder.AppendLine(data._Vo + "," + data._Bi + "," + data._Dau); 
}; 

Vous ajoutez les valeurs _Vo, _Bi et _Dau quand _Stu est "B" ou "E". Et que faites-vous quand _Stu a une autre valeur? Rien! Cela signifie que vous générez un enregistrement incomplet, ce qui est la raison la plus probable du problème que vous décrivez. Vous devez décider ce qui doit se passer dans le cas contraire et l'intégrer dans votre programme.

En général, vous semblez ne pas être totalement clair sur le flux prévu de votre programme, le format CSV et ce que les instructions que vous utilisez font dans votre code. Pour résoudre votre problème, vous devez effectuer les étapes suivantes:

  1. Obtenez une compréhension claire de la sortie désirée et de la manière dont un programme doit générer cette sortie.
  2. Comprendre le format CSV et l'importance d'un saut de ligne. Décidez du nouveau format de ligne que vous voulez utiliser ("\r\n", "\n" ou Environment.NewLine) et utilisez-le de manière cohérente dans tout votre programme.
  3. Utilisez Append si vous souhaitez ajouter uniquement le texte et AppendLine si vous souhaitez que le texte ajouté soit suivi de Environment.NewLine.
  4. Désactivez ce qui doit se produire lorsque Stu n'est pas "B" ou "E" et ajoutez ce cas à votre programme.
  5. Parcourez votre programme dans un débogueur pour confirmer qu'il fait exactement ce que vous lui demandez.