2010-08-23 9 views
1

Ok, mon constructeur csv fonctionne essentiellement. il a 3 colonnes. Nom, poste, date. Malheureusement, l'export a 4 colonnes. Nom, prénom, position, date. C'est parce que les données que je reçois de ma base de données pour le nom va Last, First. Y at-il de toute façon je peux facilement changer ce délimiteur? Ce serait très pratique haha.Modifier le délimiteur dans une exportation csv

+1

Construisez-vous le fichier vous-même? – Achilles

+0

Faire la ligne de fichier, par ligne. Donc, fondamentalement, cela craint quand après l'en-tête qui est de 3 colonnes ... je commence à obtenir Smith | John | Position | Date au lieu de Smith, John | position | date .... il me rend fou! – Tom

Répondre

1

J'ai devais faire. ceci plusieurs fois, et votre meilleur pari est d'envelopper votre nom .Cela signifie que vous devrez le manipuler séparément (sorte de)

D'après ce que je lis dans votre question, vous tirez des valeurs à partir d'un DB qui a trois colonnes: Name (LName, FName), Position, et Date Donc, votre déclaration SQL ressemble à quelque chose comme: SELECT Name, Position, [Date] FROM Table WHERE ... Et vous avez probablement un lecteur de données quelque part.

Sur la base de ces hypothèses, je ferais ceci:

//SQL Connection and SQL Command have been created separately as _conn and _cmd 
using(SqlDataReader _read = _cmd.ExecuteReader()) 
{ 
    string name = ""; 
    string position = ""; 
    string date = ""; 

    while(_read.Read()) //don't really do this, make sure you're checking for nulls and such 
    { 
     name = _read.GetString(0); 
     position = _read.GetString(1); 
     date = _read.GetString(2); 

     AddLineToLines(string.Format("{0}|{1}|{2}", name, position, date)); 
      //AddLineToLines is a call to add to your list of lines so you can 
      // write your file. 
    } 
} 

Cela vous permettra de créer un fichier Délimité Pipe (au lieu de CSV) et éviter d'avoir à échapper à des virgules.

Si vous devez avoir csv, changer cette dernière string.Format à

string.Format("\"{0}\",{1},{2}", name, position, date) 

qui échappera aux virgules entre et LastName FirstName.

+0

Cela va encore étouffer "caractères". –

0

La plupart des analyseurs CSV reconnaissent les guillemets pour compenser les virgules dans les données.

"Last, First",Admin,2010/01/01 
+0

maintenant je fais ceci: dataString + = chaîne.Concat (rep.body [x] [y], ","); Fondamentalement, ce tableau traverse et peuple les données ... Je souhaite juste que je pourrais envelopper chacun dans un devis! – Tom

+0

@Tom, Il vaut mieux être assez petit si vous allez concaténer comme ça. Après environ 5 ou 6 éléments vous êtes définitivement sur le territoire pour utiliser au moins StringBuilder. Si vous utilisez une solution basée sur StreamWriter, vous pouvez passer un StringWriter pour obtenir la chaîne, mais aussi adopter pour d'autres utilisations comme sur les pages web plus tard, donc cela donne la plus grande flexibilité. –

+0

@Tom: Avez-vous vraiment besoin de réinventer la roue? Voici 2 exemples de travail que vous pourriez utiliser: http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html http: //www.stellman-greene.com/CSVReader/ – chilltemp

0

Le problème ne change pas le délimiteur (vous changez juste le bit dans votre code avec une virgule pour être ce caractère que vous voulez utiliser) mais qu'il ne sera pas aussi interopérable par la suite.

Votre problème est que vous n'échappez pas correctement à vos champs. Faites quelque chose comme:

private void WriteItem<T>(StreamWriter sr, T item) 
{ 
    string itemString = item.ToString(); 
    if(itemString.IndexOfAny('"', ',', '\n', '\r') != -1)//skip test and always escape for different speed/filesize optimisation 
    { 
     sr.Write('"'); 
     sr.Write(itemString.Replace("\"", "\"\"")); 
     sr.Write('"'); 
    } 
    else 
     sr.Write(itemString); 
} 
private void WriteLine<T>(StreamWriter sr, IEnumerable<T> line) 
{ 
    bool first = true; 
    foreach(T item in line) 
    { 
     if(!first) 
      sr.Write(','); 
     first = false; 
     WriteItem(sr, item); 
    } 
} 
private void WriteCSV<T>(StreamWriter sr, IEnumerable<IEnumerable<T>> allLines) 
{ 
    bool first = true; 
    foreach(IEnumerable<T> line in allLines) 
    { 
     if(!first) 
      sr.Write('\n'); 
     first = false; 
     WriteLine(sr, line); 
    } 
} 

et le bit dans WriteItem qui cite l'élément quand il y a un » ou newline présent traitera votre « dernier, Format d'abord »