Laden...

textdateien und datagrid

Erstellt von FoCMB vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.352 Views
F
FoCMB Themenstarter:in
45 Beiträge seit 2007
vor 15 Jahren
textdateien und datagrid

hi,

ich habe hier eine 4 gleichartige txt-dateien.
jeder ist wie folgt aufgebaut:

wer1;wert2;wert3

nun möchte ich den inhalt aller txtdateien in einem datagrid haben.
ich habe schon versucht, den inhalt aller 4 dateien in ein array zu schreiben und dann in das datagrid zu stecken, aber das gelingt mir nicht.

vielleicht kann mir ja hier jemand helfen. die suchfunktion brachte nicht so das richtige zum vorschein.

thx

J
3.331 Beiträge seit 2006
vor 15 Jahren

Passende Suchbegriffe sind csv import. Ziel des Einlesens sollte jeweils eine **DataTable **sein, sinnvollerweise in einem gemeinsamen DataSet. Dann kannst Du sie problemlos in einem DataGrid anzeigen.

Jürgen

F
FoCMB Themenstarter:in
45 Beiträge seit 2007
vor 15 Jahren

irgendwie zeigt mir mein grid nix an 🙁



ArrayList Files = new ArrayList();
                    string filename_FZG_sortiert = dir + "\\Log-Dateien\\" + ZeitLog + "FZG_sortiert.txt";     
                    StreamWriter sw = File.CreateText(filename_FZG_sortiert);                                   
                    int count_file = 0;
                    foreach (string s in tmp_dir)
                    {
                        if (s.IndexOf("erkFZG_log") > 0)
                        {
                            Files.Add(s);
                            count_file++;
                        }
                    }


string[] sr = File.ReadAllLines(Files[0].ToString());
                        sw.WriteLine(sr[0]);
                        sw.Close();
                        ArrayList TextDaten = new ArrayList();
                        foreach (object obj in Files)
                        {
                            string[] tmp_string = File.ReadAllLines(obj.ToString());
                            string[] tmp_string_2 = new string[tmp_string.Length - 1];
                            for (int i = 0; i < tmp_string.Length - 1; i++)
                            {
                                tmp_string_2[i] = tmp_string[i + 1];
                            }
                            TextDaten.AddRange(tmp_string_2);
                        }
                        ArrayList col = new ArrayList();
                        col.AddRange(sr[0].Split('|'));
                        col.RemoveAt(0);
                        DataColumn column;
                        foreach (object objt in col)                         
                        {
                            column = new DataColumn();
                            column.ColumnName = objt.ToString();
                            DatenTabelle.setColumn(objt.ToString());
                        }
                        foreach (string data in TextDaten)
                        {
                            DTable.Rows.Add(data.Split(';').ToString());
                            DatenTabelle.setRows(data);
                        }
                    }
                    else
                    {
                        irgendwas;   
                    }
                    DatenTabelle.Show();

in DatenTabelle steht:

using System.Windows.Forms;

namespace VISSIM
{
    public partial class Tabelle : Form
    {
        public Tabelle()
        {
            InitializeComponent();
            dataGridView1 = new DataGridView();
        }

        public void setColumn(string objt)
        {
            string test = "TEST";
            dataGridView1.Columns.Add(objt, test);   
        }
        
        public void setRows(string data)
        {
            DataGridViewRow row;
            dataGridView1.Rows.Add(1);
            int zeile = dataGridView1.Rows.Count-1;
            string[] row_data = data.Split(';');
            for (int i = 0; i < row_data.Length; i++ )
            {
                dataGridView1[i, zeile].Value = row_data[i]; 
            }
        } 

    }
}

die textdateien sehen folgendermassen aus:

00:46:21.8;456;-550,791051947197;416,319375280653;518

die spalten werden korrekt angelegt und ich denke, die zeilen auch. nur werden entweder die zellen nicht befüllt oder mir wird über gridview einfach nix angezeigt.

ich hab es auch über eine datatable versucht und diese dem gridview als datasource angegeben, aber auch das hat nicht funktioniert.

hat vielleicth jemand ne gute idee ?

915 Beiträge seit 2006
vor 15 Jahren

Hrm, vielelicht geht es mir nur mir so aber finde es etwas schwer lesbar. Vorallem gibt's da nen paar Dinge die evtl. in deinem Textfile stehen die mir nicht klar sind wie das hin und herkopieren in ArrayList wobei dann wieder die erste Reihe (col.RemoveAt(0)) löscht usw..

Vereinfache das ganze damit es lesbarer wird, z.B. wie folgt:


		private DataTable CreateSource()
		{
			DataTable dt = new DataTable();

			// TEST.txt
			//333; 23421312; 6575457; 234214; blubb;
			//5464; wertwert; 57554; 676585; asdf; hasdhidahd;
			//quack; sdafasdf; uztutru; rtutritrizti;

			using (StreamReader sr = new StreamReader(@"C:\Test.txt")) 
			{
				string text = sr.ReadToEnd();
				string[] rows = text.Split('\n');

				for (int i = 0; i < rows.Length; i++)
				{
					rows[i] = rows[i].Replace(";\r", string.Empty);
					string[] columns = rows[i].Split(';');

					DataRow row = dt.NewRow();
					for (int j = 0; j < columns.Length; j++)
					{
						if (!dt.Columns.Contains(string.Format("Column{0}", j)))
							dt.Columns.Add(new DataColumn(string.Format("Column{0}", j)));

						row[j] = columns[j];
					}

					dt.Rows.Add(row);
				}

				return dt;
			}
		}

Ansonsten geh mal alles stück für stück via Breakpoints durch ob auch wirklich Daten gefüllt werdne ob den Stream evtl. zu früh schließt usw.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

F
FoCMB Themenstarter:in
45 Beiträge seit 2007
vor 15 Jahren

das mit den arraylisten mach ich, weil ich die genaue anzahl der textdateien nicht weiss und auch nicht die genaue anzahl der textdateien. deswegen lese ich mir die dateinamen der textdateien, die eine bestimmte zeichenfolge enthalten in eine arrayliste.

ich werde versuchen, den quellcode verständlicher hinzubekommen. bis dahin schreib ich unten mal eine kleine erläuterung, was die einzelnen teile machen. ich hoffe es hilft etwas.


String[] tmp_dir = Directory.GetFiles(dir + "\\Log-Dateien");
ArrayList Files = new ArrayList();
StreamWriter sw = File.CreateText(@"C:\Test.txt");                                   
int count_file = 0;  //brauch ich zum zählen der textdateien
foreach (string s in tmp_dir)
{
     if (s.IndexOf("erkFZG_log") > 0)
{
Files.Add(s);  //Liste mit allen Textdateien, die die gesuchte Zeichenfolge im namen haben
count_file++;

mit


string[] sr = File.ReadAllLines(Files[0].ToString());

lese ich die erste zteile einer textdatei aus, damit ich weiss, wieviele spalten ich benötige (steht vorher nicht fest)

hier lese ich jede textdatei zeilenweise aus. dabei soll die erste zeile aber nicht beachtet werden, da da keine werte, sondern nur die spaltenüberschrift steht. deswegen arbeite ich hier auch mit 2 string-arrays:

 foreach (object obj in Files)
                        {
                            string[] tmp_string = File.ReadAllLines(obj.ToString());
                            string[] tmp_string_2 = new string[tmp_string.Length - 1];
                            for (int i = 0; i < tmp_string.Length - 1; i++)
                            {
                                tmp_string_2[i] = tmp_string[i + 1];
                            }
                            TextDaten.AddRange(tmp_string_2);
                        }

hier erstelle ich mir eine arrayliste mit den namen der spalten. diese namen kommen aus der ersten zeile einer textdatei:

ArrayList col = new ArrayList();
                        col.AddRange(sr[0].Split('|')); //Spaltennamen in Arrayliste
                        col.RemoveAt(0);
                        DataColumn column;
                        foreach (object objt in col)     //ANlegen der Spalten                      
                        {
                            column = new DataColumn();
                            column.ColumnName = objt.ToString();
                           DatenTabelle.setColumn(objt.ToString());
                        }

hier will ich die zellen befüllen. dazu wird das formular "tabellen" aufgerufen und die strings übergeben:

foreach (string data in TextDaten)
                        {
                            DatenTabelle.setRows(data); 
                        }

und in dem tabellen-formular steht für setRows (zum anlegen der zeilen und inhalte):

DataGridViewRow row;
            dataGridView1.Rows.Add(1); //hier will ich eine Zeile anlegen
            int zeile = dataGridView1.Rows.Count-1;
            string[] row_data = data.Split(';'); //hier stehen die einzelnen strings für die zellen in einem array
            for (int i = 0; i < row_data.Length; i++ )
            {
                dataGridView1[i, zeile].Value = row_data[i];  //hier will ich die zellen befüllen
            }
F
FoCMB Themenstarter:in
45 Beiträge seit 2007
vor 15 Jahren

habs gefunden. hatte vergessen, die Rows hinzuzufügen, bzw. war das falsch.