Importer un fichier .cvs dans une data table

cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009 - 28 juil. 2009 à 01:39
cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009 - 29 juil. 2009 à 23:26
Salut!!

J'essai de loader un fichier .csv dans une data table. Je suis très nouvelle à tout ceci. J'ai pris un exemple sur ce site mais ça ne fonctionne pas. Voici ce que j'ai jusqu'à présent avec les codes d'erreur:


public void ImportFile()
{
// on cree une table
DataTable dt = new DataTable("test");
// on cree les colonnes
dt.Columns.Add("selection", System.Type.GetType("System.String"));
dt.Columns.Add("geoval", System.Type.GetType("System.String"));
dt.Columns.Add("indval", System.Type.GetType("System.String"));
dt.Columns.Add("var", System.Type.GetType("System.String"));
dt.Columns.Add("start_date", System.Type.GetType("System.String"));
dt.Columns.Add("end_date", System.Type.GetType("System.String"));
dt.Columns.Add("flgcansim", System.Type.GetType("System.String"));
dt.Columns.Add("flgfreeze", System.Type.GetType("System.String"));
// read and insert a new line
System.IO.StreamReader csv_file = File.OpenText("//Rnds/Lhs1/sephdev/Adminseries/cansimseries.csv");
while (csv_file.Peek() >= 0)
{
// read and add a line
string line = csv_file.ReadLine();
string[] vals = line.Split(';');
DataRow dr = dt.NewRow();
dr["selection"] = vals[0];
dr["geoval"] = vals[1];
dr["indval"] = vals[2];
dr["var"] = vals[3];
dr["start_date"] = vals[4];
dr["start_end"] = vals[5];
dr["flgcansim"] = vals[6];
dr["flgfreeze"] = vals[7];
// add the line
dt.Rows.Add(dr);
}
csv_file.Close();
//Create data grid view
dgv.DataSource = dt;
}




Merci!!

9 réponses

Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
28 juil. 2009 à 03:04
Je suppose que vous avez lié un fichier image avec vos erreurs, mais il ne s'affiche pas chez moi.

dt.Columns.Add("end_date", System.Type.GetType("System.String"));
dr["start_end"] = vals[5];

"start_end" ... Je ne sais pas si c'est la fin du début mais pour la compilation de votre programme je soupçonne que ce soit le début de la fin ...

De tout façon, préférez typeof(String) à System.Type.GetType("System.String"). Le premier est résolu à la compilation tandis que le second nécessitera un appel supplémentaire au CLR.

Mathieu.
0
cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009
28 juil. 2009 à 17:17
Re-bonjour!!

start_date et end_date ne sont que des variables trouvées dans le fichier à importer.

Pour ce qui est des erreurs, les voici:

ERROR_ACCESS_DENIED 5
ERROR_INVALID_PARAMETER 87

Voici mes class :

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace System.IO
{
// Summary:
// Implements a System.IO.TextReader that reads characters from a byte stream
// in a particular encoding.
[Serializable]
[ComVisible(true)]
public class StreamReader : TextReader
{
// Summary:
// A System.IO.StreamReader object around an empty stream.
public static readonly StreamReader Null;

public StreamReader(Stream stream);
public StreamReader(string path);
public StreamReader(Stream stream, bool detectEncodingFromByteOrderMarks);
public StreamReader(Stream stream, Encoding encoding);
public StreamReader(string path, bool detectEncodingFromByteOrderMarks);
public StreamReader(string path, Encoding encoding);
public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks);
public StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks);
public StreamReader(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize);
public StreamReader(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize);
public virtual Stream BaseStream { get; }
public virtual Encoding CurrentEncoding { get; }
public bool EndOfStream { get; }
public override void Close();
public void DiscardBufferedData();
public override int Peek();
public override int Read();
public override int Read(char[] buffer, int index, int count);
public override string ReadLine();
public override string ReadToEnd();
}
}




using System;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
using System.Text;

namespace System.IO
{
// Summary:
// Provides static methods for the creation, copying, deletion, moving, and
// opening of files, and aids in the creation of System.IO.FileStream objects.
[ComVisible(true)]
public static class File
{

public static void AppendAllText(string path, string contents);
public static void AppendAllText(string path, string contents, Encoding encoding);
public static StreamWriter AppendText(string path);
public static void Copy(string sourceFileName, string destFileName);
public static void Copy(string sourceFileName, string destFileName, bool overwrite);
public static FileStream Create(string path);
public static FileStream Create(string path, int bufferSize);
public static FileStream Create(string path, int bufferSize, FileOptions options);
public static FileStream Create(string path, int bufferSize, FileOptions options, FileSecurity fileSecurity);
public static StreamWriter CreateText(string path);
public static StreamWriter CreateText(string path);
public static void Decrypt(string path);
public static void Encrypt(string path);
public static bool Exists(string path);
public static FileSecurity GetAccessControl(string path);
public static FileSecurity GetAccessControl(string path, AccessControlSections includeSections);
public static FileAttributes GetAttributes(string path);
public static DateTime GetCreationTime(string path);
public static DateTime GetLastAccessTime(string path);
public static void Move(string sourceFileName, string destFileName);
public static FileStream Open(string path, FileMode mode);
public static FileStream Open(string path, FileMode mode, FileAccess access);
public static FileStream Open(string path, FileMode mode, FileAccess access, FileShare share);
public static FileStream OpenRead(string path);
public static StreamReader OpenText(string path);
public static FileStream OpenWrite(string path);
public static byte[] ReadAllBytes(string path);
public static string[] ReadAllLines(string path);
public static string[] ReadAllLines(string path, Encoding encoding);
public static string ReadAllText(string path);
public static string ReadAllText(string path, Encoding encoding);
public static void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName);
public static void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors);
public static void SetAttributes(string path, FileAttributes fileAttributes);
public static void SetCreationTime(string path, DateTime creationTime);
public static void SetCreationTimeUtc(string path, DateTime creationTimeUtc);
public static void SetLastAccessTime(string path, DateTime lastAccessTime);
}
}

À l'aide!!!
0
Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
29 juil. 2009 à 02:25
Ce que je voulais dire c'est que vous accédez ici à une colonne nommée "start_end", un nom qui me semble un peu bizarre :
dr["start_end"] = vals[5];

Et que je ne vous vois nulle part créer une colonne de ce nom, seulement une colonne "start_date" :
dt.Columns.Add("start_date", System.Type.GetType("System.String"));

Si vous essayez d'accéder à la colonne "start_end" alors que vous ne l'avez créée nulle part, il va vous envoyer une erreur dans les gencives, c'est logique.

Essayez de changer :
dr["start_end"] = vals[5];
en :
dr["start_date"] = vals[5];

Mathieu.
0
cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009
29 juil. 2009 à 13:17
Hé boy!!!

♪♫♪♪Pourquoi t'es dans la lune??♪♫♪♪

Je travaille trop je crois... besoin de vacances!! Désolé!!

Je répare mon erreur et reviens avec le résultat... merci beaucoup Mathieu!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009
29 juil. 2009 à 15:11
Ça fonctionne... à peu près!!!

Voici mon problème maintenant.

La dt est ajouté dans ma dgv existante (colonnes en plus). Ça fonctionne si je crée une deuxième dgv qui remplace celle qui est déjà existante, mais ce n'ai pas vraiment ce que je veux. Ce que je voudrais, c'est que les valeurs de la dt s'ajoute aux colonnes déjà existante dans le dgv.

// on cree une table

DataTable dt = new DataTable();

// on cree les colonnes

dt.Columns.Add(clientSelection, System.Type.GetType("System.String"));

dt.Columns.Add("geoval", System.Type.GetType("System.String"));

dt.Columns.Add("indval", System.Type.GetType("System.String"));

dt.Columns.Add("var", System.Type.GetType("System.String"));

dt.Columns.Add("start_date", System.Type.GetType("System.String"));

dt.Columns.Add("end_date", System.Type.GetType("System.String"));

dt.Columns.Add("flgcansim", System.Type.GetType("System.String"));

dt.Columns.Add("flgfreeze", System.Type.GetType("System.String"));

// read and insert a new line

System.IO.StreamReader csv_file = File.OpenText("c:/cansimseries.csv");

while (csv_file.Peek() >= 0)

{

// read and add a line

string line = csv_file.ReadLine();

string[] vals = line.Split(';');

DataRow dr = dt.NewRow();

dr[clientSelection] = vals[0];

dr["geoval"] = vals[1];

dr["indval"] = vals[2];

dr["var"] = vals[3];

dr["start_date"] = vals[4];

dr["end_date"] = vals[5];

dr["flgcansim"] = vals[6];

dr["flgfreeze"] = vals[7];

// add the line

dt.Rows.Add(dr);

}

csv_file.Close();

// on genere le tableau

dgv.DataSource = dt;

}



Aussi, j'avais ajouté le code pour créer la table dans ma classe "Utility" que j'appelais de ma "MainForm" . Par contre, la dt ne se transfert pas même si j'ai ajouté le code "public DataTable dt = null;" dans ma "MainForm".

util.ImportFile(); (qui contient le code ci haut)
dgv.DataSource = dt;

Une idée de ce que cela pourrait être?
0
Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
29 juil. 2009 à 16:18
Tu as déjà un DataGridView, avec déjà des colonnes, des lignes et des données, et tu voudrais que les colonnes de la DataTable que tu viens de créer s'y ajoutent ?

Pour ta seconde question :

Si le code que tu as mis dans ton dernier message est le code de ta méthode ImportFile() et que DataTable dt new DataTable(); est bien dans méthode, alors c'est naturel que la référence dt soit détruite à la sortie de la méthode, car elle sort de portée. L'objet seul existe encore car dgv.DataSource dt; lui a affecté une nouvelle référence. Mais en dehors de ta méthode dt n'existe pas, en tout cas pas le dt auquel tu as affecté la DataTable au début de la méthode.

Je suis même étonne que ton code compile alors que tu affectes dt en dehors de la méthode. Je suppose que tu as du créer un autre DataTable dt
à l'extérieur - en public dans la MainForm.

Tu as en gros deux possibilités rapides :
La première est de rendre MainForm.dt statique et de l'affecter à partir de la méthode.
La seconde est de retourner la dt créée au sein de la méthode comme valeur de retour et de l'affecter là où tu le désires.

Mathieu.
0
cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009
29 juil. 2009 à 17:21
Re-bonjour Mathieu,

Pour ta première question... oui sauf que la grille ne contient aucune données.

J'ai déjà essayé ta deuxième suggestion. J'ai fais comme suit:

classe Utility:

public Datatable ImportFile()
{
DataTable dt = new DataTable();

// on cree les colonnes

dt.Columns.Add(clientSelection, System.Type.GetType("System.String"));

dt.Columns.Add("geoval", System.Type.GetType("System.String"));

dt.Columns.Add("indval", System.Type.GetType("System.String"));

dt.Columns.Add("var", System.Type.GetType("System.String"));

dt.Columns.Add("start_date", System.Type.GetType("System.String"));

dt.Columns.Add("end_date", System.Type.GetType("System.String"));

dt.Columns.Add("flgcansim", System.Type.GetType("System.String"));

dt.Columns.Add("flgfreeze", System.Type.GetType("System.String"));

// read and insert a new line

System.IO.StreamReader csv_file = File.OpenText("c:/cansimseries.csv");

while (csv_file.Peek() >= 0)

{

// read and add a line

string line = csv_file.ReadLine();

string[] vals = line.Split(';');

DataRow dr = dt.NewRow();

dr[clientSelection] = vals[0];

dr["geoval"] = vals[1];

dr["indval"] = vals[2];

dr["var"] = vals[3];

dr["start_date"] = vals[4];

dr["end_date"] = vals[5];

dr["flgcansim"] = vals[6];

dr["flgfreeze"] = vals[7];

// add the line

dt.Rows.Add(dr);

}

csv_file.Close();
return dt;
}

MainForm:
util.ImportFile();
dgv.DataSource = dt;




Est-ce que c'est ce que tu veux dire? Ça ne fonctionne pas!
0
Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
29 juil. 2009 à 22:31
Avec dgv.DataSource = dt, le dt que tu affectes à dgv.DataSource n'est pas la valeur de retur de ta fonction util.ImportFile(). Ce doit toujours être un dt créé autrepart, du moins si le code compile. Quand tu dis que "ça ne fonctionne pas", tu devrais préciser si ça ne compile pas, ou si ça ne fonctionne pas à l'exécution. Dans le premier cas, indique nous quelles sont les erreurs, dans le second quelles sont les exceptions levées par Framework.

Essaye :
dgv.DataSource = util.ImportFile();

Mathieu.
0
cs_chalmyl Messages postés 12 Date d'inscription dimanche 7 octobre 2007 Statut Membre Dernière intervention 29 juillet 2009
29 juil. 2009 à 23:26
D'accord... je saurai pour la prochaine fois. Merci Mathieu pour tout ton aide.

En attendant, j'ai trouvé solution à mon problème. Voici:


private void btnImport_Click(object sender, EventArgs e)

{

try

{

gbSeries.Enabled = false;

AssignValues();

btnSave.Enabled = true;

// read and insert a new line

System.IO.StreamReader csv_file = File.OpenText("c:/cansimseries.csv");

while (csv_file.Peek() >= 0)

{

// read and add a line

string line = csv_file.ReadLine();

string[] vals = line.Split(';');

dgv.Rows.Add(new object[] { vals[0],

vals[1],

vals[2],

vals[3],

vals[4],

vals[5],

cansim,

freeze });

}

csv_file.Close();

}



catch (Exception ex)

{

MessageBox.Show("");

return;

}

}
0
Rejoignez-nous