27. april 2005 - 10:21Der er
52 kommentarer og 1 løsning
oprette en tabel fra en tekst fil.
Hej Jeg har et styk kode som skal deles i rækker og koloner. Deling af rækker er afhængig af en xml fil, da nogle gange er det ’-’ andre gange ’+’ der skiller rækker, fordi XML bliver ændret en gang i mellem.
using System; using System.IO; using System.Collections; using System.Data; using System.Xml; using System.Text.RegularExpressions;
namespace version1 { /// <summary> /// Summary description for Class1. /// </summary> class input { static void Main(string[] args) {
//får fat i tegnet XmlDocument doc = new XmlDocument(); doc.Load(@"C:\test.exe.Settings.xml"); XmlNode n = doc.DocumentElement.SelectSingleNode("Section/Key[@Name='Delimiter']"); String d = n.Attributes["Value"].Value;
StreamReader objReader = new StreamReader(@"C:\ test.txt"); string sLine=""; ArrayList arrText = new ArrayList(); while (sLine != null) { sLine = objReader.ReadLine(); if (sLine != null) {arrText.Add(sLine); d.Split(); }
} objReader.Close();
foreach (string sOutput in arrText) Console.WriteLine(sOutput); Console.ReadLine();
Sådan skal det se ud: ******************************* *Hej * 12 * 12,2 * 12 stk* ******************************* *15.3 * t * t_t * * *******************************
namespace Eksperten { public class App { public static void Main(string[] args) { XmlDocument Conf = new XmlDocument(); Conf.Load(@"C:\Source.C#\PocEksperten\Conf.xml");
using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); Console.WriteLine(string.Join(" # ", SplitData)); // bare med som en test } } } } }
hej nielle. nu har jeg fået den til at virke. tak for hjælpen, men det var ikke lige det jeg vil. det jeg vil at dataerne bliver sæt i tabeler, med rækker og koloner
Nu har du lige drejet tabellen 90 grader. Det gør straks opgaven en del mere besværligt - det er altid nemmest at skrive tingende du på den fom man har dem:
Men sådan her sørger du for at få skrevet til Debug-vinduet:
using System; using System.IO; using System.Xml; using System.Diagnostics;
namespace Eksperten { public class App { public static void Main(string[] args) { XmlDocument Conf = new XmlDocument(); Conf.Load(@"C:\Source.C#\PocEksperten\Conf.xml");
using System; using System.IO; using System.Xml; using System.Data; // DataSet using System.Windows.Forms; // DataGrid
namespace Eksperten { public class App { public static void Main(string[] args) { XmlDocument Conf = new XmlDocument(); Conf.Load(@"C:\Source.C#\PocEksperten\Conf.xml");
DataSet DS = new DataSet(); // Trin #1 - Opret et DataSet. DS.Tables.Add("Data"); // Trin #2 - Opret en tabel som du kunne kalde "Data" DS.Tables["Data"].Columns.Add("Col1"); // Trin 3.1 - Opret en søjle som du kunne kalde "Col1" DS.Tables["Data"].Columns.Add("Col2"); // Trin 3.2 - Opret en søjle som du kunne kalde "Col2" DS.Tables["Data"].Columns.Add("Col3"); // ... DS.Tables["Data"].Columns.Add("Col4"); // ...
using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); DS.Tables["Data"].Rows.Add(SplitData); // Trin 4 - Put dine data i DataSet'et } }
DataGrid DG = new DataGrid(); // Trin 5 - Opret et DataGrid DG.DataSource = DS; // Trin 6 - Fortæl at DataGrid'et skal tage sine data fra DataSet'et
// En hurtig test-udskrift, men du kan jo gøre noget andet. DataSet DS2 = (DataSet) DG.DataSource; foreach (DataRow DR in DS2.Tables["Data"].Rows) { Console.WriteLine("{0} # {1} # {2} # {3}", DR["Col1"], DR["Col2"], DR["Col3"], DR["Col4"]); } } } }
hej niele. jeg ved ikke hvordan det skete, jeg også nu her på eksperten, det bliver helt sikkert dig der får dem og jeg synes du skal have 50 istedet for 40. tekst filen ændres hele tiden, derfor er det ikke det samme antal rækker og koloner den får.
Hvis du ikke ønsker at bruge DataGrid har du intet problem mht. at antallet af kolonner ændre sig. Mit kodeeksempel 27/04-2005 12:51:51 er uafhængigt af antal kolonner
Hvis du ønsker at bruge DataGrid skal du kende antallet af kolonner, Ellers får du en fejl når du forsøger at indsætte i dit DataSet; I mit kodeeksempel 27/04-2005 14:09:39 viste jeg at der var 4 kolonner, og derforoprettede jeg dem.
Du har nu to muligheder; Hvis du har fuld kontrol over hvordan din xml-fil dannes så kunne du eventuelt tilføje oplysningerne i denne:
Alternativt kunne du forsøge at bestemme antallet på runtime. Uheldigvis kan du vist ikke nøjes med at undersøge hvor mange elementer der er i din første række - i dit eksempel har du f.eks. ikke det samme antal i begge rækker. Du er altså nødt til at løbe samtlige rækker igennem for at finde maksimum.
using System; using System.IO; using System.Xml; using System.Data; // DataSet using System.Windows.Forms; // DataGrid
namespace Eksperten { public class App { public static void Main(string[] args) { XmlDocument Conf = new XmlDocument(); Conf.Load(@"C:\Source.C#\PocEksperten\Conf.xml");
// Find ud af hvor mange søjler der er i den række som har flest int MaxColNo = 0; using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); MaxColNo = Math.Max(MaxColNo, SplitData.Length); } }
DataSet DS = new DataSet(); // Trin #1 - Opret et DataSet. DS.Tables.Add("Data"); // Trin #2 - Opret en tabel som du kunne kalde "Data"
// Opret et antal søjler svarende til værdien i MaxColNo for (int ColNo=1; ColNo<=MaxColNo; ColNo++) { string ColName = "Col" + ColNo.ToString(); DS.Tables["Data"].Columns.Add(ColName); // Trin 3.ColNo - Opret en søjle som du kunne kalde "Col..." }
using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); DS.Tables["Data"].Rows.Add(SplitData); // Trin 4 - Put dine data i DataSet'et } }
DataGrid DG = new DataGrid(); // Trin 5 - Opret et DataGrid DG.DataSource = DS; // Trin 6 - Fortæl at DataGrid'et skal tage sine data fra DataSet'et } } }
// Trin #1 - Opret et DataSet. // Trin #2 - Opret en tabel som du kunne kalde "Data" // Trin 3.ColNo - Opret en søjle som du kunne kalde "Col..." // Trin 4 // Trin 5 // Trin 6 jeg har næsten aldrig prøvet C#, hvordan skal jeg gøre det?
Du bliver altså nødt til at fortælle lidt mere om hvad fejlbeskeden er. 27/04-2005 12:05:41 sagde du at det virkede, men i siden da har vi lavet en masse med DataGrid, og det er måsk det som ikke virker?
Nu ved jeg forresten ikke hvilken type program du er igang med at lave; Et Console-program, et Windows-program eller et Web-program. Det giver kun mening at bruge DataGrid sammen med det to sidste. I mit eksempel opretter jeg den selv, men hvis du er ved at lave et Windows-projekt skal du nok ikke lige lave det på lige den måde - for ellers får du ikke vist noget (men det burde nu altså heller ikke give fejl).
hej nielle. jeg prøvede at køre svaret 27/04-2005 15:35:24 men det lykkes ikke, og jeg har ændret navnet på xml og txt filen. forresten txt filen skal kun står i stedet for FileName? tak fordi du gide at bruge tid på det
Nej, programmet 27/04-2005 15:35:24 kan nok ikke køre som det ser ud. Jeg gætter på at den brokker sig over "using System.Windows.Forms;". Forklaring følger...
Det lader til at du køre programmet som en Console-applikation - dvs. at output kummer ud i en sort DOS-boks, altså et tekstbaseret vindue med sort baggrund. Er det ikke korrekt? Det er mit 1. spørgsmål.
Alternativet er at køre det som et "rigtigt" Windows-program, men jeg har valgt at vise mine kodeeksempler som Console, idet at det væsentlige ellers ville drukne i alt det "bogholderi" som der skal til i et Windwos-program.
Grunden til at "using System.Windows.Forms;" ikke virker er at dette høre til Windows-programmer og ikke i Console-programmer. Uheldigvis er det også der at DataGrid ligger, og derfor har jeg været nødt til at inkludere det for at alt det der med DataGrid overhovedet kan fungere. Nu er det så sådan at det ikke er nok at skrive "using ..." hvorefter det hele så virker - der skal nemlig *også* tilføjes en reference til den dll-fil som det drejer sig om: "System.Windows.Forms.dll". Alt efter hvordan du kompilere dit program, så gøres dette på lidt forskellige måder. Derfor mit 2. spørgsmål: Hvordan kompilere du? Er det f.eks. Visual Studio .NET eller Visual C# .NET du bruger?
Når jeg nu antager at du bruger et af Visual XXX . NET værktøjerne så er løsningen denne: Ude i højre side har du er vindue som hedder "Solution explorer". I dette er der et punkt som hedder "References". Højreklik på dette, og vælg "Add Reference..." fra den context-menu som kommer frem. Der kommer nu en dialog frem hvorfra du kan vælge referencer. Under den tab som hedder ".NET" scroller du nu ned til at du finder filen "System.Windows.Forms.dll". Tilføj den så som en reference.
Nu skulle dit program så helst gerne kunne kompilere. 3. spørgsmål: Gør det det?
Men, men, men! Hvorfor ønsker du egentlig at bruge DataGrid? Dette er en komponent som det faktisk kun giver mening at bruge i et Windows-program - ikke i et Console-program. Det er faktisk også derfor at den ligger i "System.Windows.Forms" til at starte med. Hvis du kan leve uden DatGrid så er der ingen grund til at lave al den gymastik som vi har været igennem ovenfor.
Hvis du derimod har i sinde at lave et Windows-program så er ideen ok, men så mangler vi nu stadig en masse kode før at det hele giver fornuft. Så derfor vil jeg gerne gentage mit 1. spørgsmål: Hvad er der for en slags program du ønsker at lave?
> forresten txt filen skal kun står i stedet for FileName?
Nu er jeg altså ikke helt sikker på at jeg forstår spørgsmålet.
Men nej, du skal ikke skrive selve navnet på TXT-filen på det sted hvor at jeg har skrevet FileName. Pointen er at TXT-filen jo hele tiden kan have et nyt navn (det skriver du i hvert fald selv til at starte med), og at du så hver eneste gang at den ændre navn skal ind og rette i koden.
Nu er det jo midlertidig så snedigt at man kan læse det aktuelle navn i XML-filen. Min kodestump:
Hvorfor så ikke udvide oplysningerne i XML-filen til at inkludere den fulde sti til TXT-filen? Under alle omstændigheder er der vel ingen grund til at have navnet på TXT-filen i XML-filen hvis det ikke bruges til noget som helst?
Ang. dit svar på mit 1. spørgsmål - den kode du lagde ud med at vise da du stillede spørgsmålet, er til et Console-program - ikke til et Windows-program.
spørgsmål 10:17:41: hvordan kan du se at det er en console og ikke windows? jeg sagde windows da den ikke køres i en sort DOS-boks. spørgsmål 10:15:54: jeg kan ikke ændre ved xml filen da det er noget jeg får og ikke noget jeg oprette selv. filen ser sådan ud: <?xml version="1.0" encoding="UTF-16" ?> - <ApplicationSettings> - <Section Name="a"> <Key Name="Line Name" Value="h" /> </Section> - <Section Name="b"> <Key Name="Path" Value="C:\fil\" /> <Key Name="File Name" Value="test.txt" /> <Key Name="Delimiter" Value="-" /> </Section> </ApplicationSettings>
dvs. hvordan ved den at test.txt ligger i C:\fil\?
Hvis du ikke har mulighed for at tilrette XML-filen så kan man ikke se hvor test.txt ligger henne. Men så kunne en anden løsning være at I altid sørgede for at test.txt kom til at lægge i en bestemt bibliotek, og så bille løsningen være noget i stil med:
ok, nu ser det bedre ud. nu spørg jeg dig et dumt spørgsmål fordi jeg har ikke så meget styrre på C#, spørgsmålet er hvordan kan jeg får tabelen vist når jeg debuger? kan jeg bare brug: Console.WriteLine();, og hvor skal den lægges henne?
// Find ud af hvor mange søjler der er i den række som har flest int MaxColNo = 0; using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); MaxColNo = Math.Max(MaxColNo, SplitData.Length);
} }
DataSet DS = new DataSet(); // Trin #1 - Opret et DataSet. DS.Tables.Add("Data"); // Trin #2 - Opret en tabel som du kunne kalde "Data"
// Opret et antal søjler svarende til værdien i MaxColNo for (int ColNo=1; ColNo<=MaxColNo; ColNo++) { string ColName = "Col" + ColNo.ToString(); DS.Tables["Data"].Columns.Add(ColName); // Trin 3.ColNo - Opret en søjle som du kunne kalde "Col..." }
using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); DS.Tables["Data"].Rows.Add(SplitData); // Trin 4 - Put dine data i DataSet'et
}
}
DataGrid DG = new DataGrid(); // Trin 5 - Opret et DataGrid DG.DataSource = DS; // Trin 6 - Fortæl at DataGrid'et skal tage sine data fra DataSet'et //Console.WriteLine(); } } }
Når du siger at den skal vises i en tabel, så bliver du nødt til at gøre dig klart hvad det er for en tabel du skal lave; Skal den f.eks. vises på en hjemmeside eller som en tabel i et Windows-program. Det er ikke nok at sige "tabel" - for det er mange forskellige ting.
// Find ud af hvor mange søjler der er i den række som har flest. int MaxColNo = 0; using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); MaxColNo = Math.Max(MaxColNo, SplitData.Length); } }
DataSet DS = new DataSet(); // Trin #1 - Opret et DataSet. DS.Tables.Add("Data"); // Trin #2 - Opret en tabel som du kunne kalde "Data"
// Opret et antal søjler svarende til værdien i MaxColNo for (int ColNo=1; ColNo<=MaxColNo; ColNo++) { string ColName = "Col" + ColNo.ToString(); DS.Tables["Data"].Columns.Add(ColName); // Trin 3.ColNo - Opret en søjle som du kunne kalde "Col..." }
using (StreamReader SR = new StreamReader(FileName)) { string Data; while ((Data = SR.ReadLine()) != null) { string[] SplitData = Data.Split(Delimeter); DS.Tables["Data"].Rows.Add(SplitData); // Trin 4 - Put dine data i DataSet'et } }
DataGrid DG = new DataGrid(); // Trin 5 - Opret et DataGrid DG.DataSource = DS; // Trin 6 - Fortæl at DataGrid'et skal tage sine data fra DataSet'et
// Vis værdierne fra DataGrid i debuggeren. DataSet DS2 = (DataSet) DG.DataSource; foreach (DataRow DR in DS2.Tables["Data"].Rows) { string DebuggerOutput = ""; for (int ColNo=1; ColNo<=MaxColNo; ColNo++) { string ColName = "Col" + ColNo.ToString();
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.