Avatar billede starf Nybegynder
03. oktober 2011 - 09:51 Der er 24 kommentarer og
1 løsning

array og sort på dato

Jeg har en fil der er tab sepereret og har data der ser sådan her ud

dato.tid[tap]navn[tap]emne

Jeg læser så dette her ind i et array og printer det. Hvordan får jeg det sorteret på dato?


TextReader sr = new StreamReader(@"C:/Temp/Kalender.txt", Encoding.GetEncoding("iso-8859-1"));



string contents = sr.ReadToEnd();
string[] myArray = { contents };
Array.Sort(myArray);
foreach (string kalenderdata in myArray)
{

graphic.DrawString(kalenderdata, new Font("Arial", 18), new SolidBrush(Color.White), new PointF(5.0f, 35.0f));
}
Avatar billede johny Nybegynder
03. oktober 2011 - 10:40 #1
Noget i den her stil (ikke testet):

TextReader sr = new StreamReader(@"C:/Temp/Kalender.txt", Encoding.GetEncoding("iso-8859-1"));



string contents = sr.ReadToEnd();
string[] myArray = { contents };
Array.Sort(myArray);
foreach (var kalenderdata in myArray.Split('\t').Select(s => new { Date = new DateTime(s[0]), Name = s[1], Subject = s[2]}).OrderBy(item => item.Date))
{
var kalenderDataToPrint = string.Format("{0} - {1} - {2}), kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject);

graphic.DrawString(kalenderDataToPrint , new Font("Arial", 18), new SolidBrush(Color.White), new PointF(5.0f, 35.0f));
}
Avatar billede johny Nybegynder
03. oktober 2011 - 10:42 #2
Det kan selvfølgelig "smukkeseres" en del, men det var bare for lige at vise konceptet. Er der noget du er i tvivl om spørger du bare.

NB: Kræver et "using System.Linq" i toppen af kodefilen.
Avatar billede starf Nybegynder
03. oktober 2011 - 10:46 #3
Tak jeg prøver lige og kigger på det :)
Avatar billede starf Nybegynder
03. oktober 2011 - 10:53 #4
2 ting:

1: Error    2    'System.Array' does not contain a definition for 'Split' and no extension method 'Split' accepting a first argument of type 'System.Array' could be found

på denne her:
foreach (var kalenderdata in myArray.Split('\t').Select(s => new { Date = new DateTime(s[0]), Name = s[1], Subject = s[2]}).OrderBy(item => item.Date))

2:
var kalenderDataToPrint = string.Format("{0} - {1} - {2}), kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject;

denne der er den ikke glad for, ?

Her er min using:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.IO;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Linq;
Avatar billede starf Nybegynder
03. oktober 2011 - 12:36 #5
ser ud til du ikke kan split på et array men kun på en string?
Avatar billede sherlock Nybegynder
03. oktober 2011 - 13:38 #6
En anden lille,hurtig  "høker" :)


            TextReader sr = new StreamReader(@"textfile1.txt", Encoding.GetEncoding("iso-8859-1"));
            string contents = sr.ReadToEnd();

            string[] myArray =  contents.Split(Environment.NewLine.ToCharArray()[0]) ;

            SortedDictionary<DateTime, string> sd = new SortedDictionary<DateTime, string>();
            foreach (string kalenderdata in myArray)
            {
                sd.Add(Convert.ToDateTime(kalenderdata.Split((char)9)[0]), kalenderdata);
            }

            foreach (DateTime dt in sd.Keys)
            {
                listBox1.Items.Add(sd[dt]);
            }
Avatar billede starf Nybegynder
03. oktober 2011 - 13:57 #7
Det ser for rodet ud, burde jeg ikke kunne gøre noget hen af dette?


string kalender = System.IO.File.ReadAllText(@"C:/Temp/Kalender.txt", Encoding.GetEncoding("iso-8859-1"));

kalender.Split('\t').Select(s => new { Date = new DateTime(s[0]), Name = s[1], Subject = s[2]}).OrderBy(item => item.Date);

var kalenderDataToPrint = string.Format("{0} - {1} - {2}), kalender.Date, kalender.Name, kalender.Subject");

string besked = " Mødelokalet er optaget"; //txt

  graphic.DrawString(kalenderDataToPrint, new Font("Arial", 18), new SolidBrush(Color.White), new PointF(5.0f, 35.0f));

??

Dog får jeg lidt fejl med min string.format..
"Index (zero based) must be greater than or equal to zero and less than the size of the argument list."
Avatar billede sherlock Nybegynder
03. oktober 2011 - 14:23 #8
Du skal starte med at splitte dit input på newline..


            string kalender = System.IO.File.ReadAllText(@"textfile1.txt", Encoding.GetEncoding("iso-8859-1"));

            var kalenderData = kalender.Replace("\r","").Split('\n')
                .Select(s => new { Date = Convert.ToDateTime(s.Split('\t')[0]),
                    Name = s.Split('\t')[1],
                    Subject = s.Split('\t')[2] })
                    .OrderBy(item => item.Date);
            foreach (var o in kalenderData)
            {
                string kalenderDataToPrint = string.Format("{0:dd-MM-yyyy} - {1} - {2}", o.Date, o.Name, o.Subject);
            }
Avatar billede starf Nybegynder
03. oktober 2011 - 14:31 #9
hvordan printer jeg så hele indholdet i
graphic.DrawString(kalenderDataToPrint, new Font("Arial", 18), new SolidBrush(Color.White), new PointF(5.0f, 35.0f));

?

ser ud til den heller ikke kan li det dato format der er i min text fil, det ser sådan her ud :
14-10-2011 10:00:00

kan man bruge string format til at lave det til noget det kan li ?
"String was not recognized as a valid DateTime."
Avatar billede sherlock Nybegynder
03. oktober 2011 - 14:41 #10
Hmmm. Jeg har lige prøvet med dit dato-format.
Det gav ingen problemer.

Mht. print, så skal du printe en gang for hver instans af "kalenderDataToPrint" i "foreach (var o ...."-loopet.
Avatar billede starf Nybegynder
03. oktober 2011 - 14:52 #11
Hmm min txtfil ser sådan her ud:
26-10-2011 08:00:00    besøg af Cisco    480
06-10-2011 08:30:00    test6    30

når jeg så køre koden, får jeg "String was not recognized as a valid DateTime." på denne del:

{
Date = Convert.ToDateTime(s.Split('\t')[0]),
Name = s.Split('\t')[1],
Subject = s.Split('\t')[2]
}

har du et eksempel på at printe hver instants?
Avatar billede sherlock Nybegynder
03. oktober 2011 - 15:07 #12
Din tekstfil indeholder sandsynligvis en tom linie tilsidst.

Print er en hel disciplin for sig.
Prøv at se et simpelt eksempel her:
http://www.c-sharpcorner.com/UploadFile/mgold/PritinginCSharp11222005040630AM/PritinginCSharp.aspx
Avatar billede starf Nybegynder
03. oktober 2011 - 15:30 #13
Du har ret, der er ingen fejl hvis jeg fjerner den. Problemet er bare den fil vil altid have en sidste tom linie, nogen måde uden om det på?
Avatar billede sherlock Nybegynder
04. oktober 2011 - 00:13 #14
Ja. Så vil jeg gå tilbage til mit første eksempel og sætte et lille tjek ind, så du er sikker på, at en linie ikke er tom.
Jeg ved ikke om Linq-metoden kan skrives, så den undlader tomme linier, men jeg tvivler.

TextReader sr = new StreamReader(@"textfile1.txt", Encoding.GetEncoding("iso-8859-1"));
string contents = sr.ReadToEnd();

string[] myArray =  contents.Split(Environment.NewLine.ToCharArray()[0]) ;

SortedDictionary<DateTime, string> sd = new SortedDictionary<DateTime, string>();
foreach (string kalenderdata in myArray)
{
  if (kalenderdata.Length > 10)
    sd.Add(Convert.ToDateTime(kalenderdata.Split((char)9)[0]), kalenderdata);
}

// Print her
foreach (DateTime dt in sd.Keys)
{
    // Print sd[dt].Split((char)9)[0] + " - " + sd[dt].Split((char)9)[1] + sd[dt].Split((char)9)[2];
}
Avatar billede starf Nybegynder
04. oktober 2011 - 08:20 #15
jeg takker for hjælpen, ser ud til det virker som det skal nu.(måtte dog lave lidt om, så jeg brugte stringbuilder til at lave en stor string med hele resultatet i) Smid et svar :)
Avatar billede johny Nybegynder
04. oktober 2011 - 08:26 #16
Mærkeligt, jeg har ikke fået nogen notifikation om nye indlæg i denne tråd, så jeg har slet ikke lige set hvad der var kommet. Og ja, den her gang har jeg så taget mig tiden, rent faktisk at få tjekket syntaksen, det andet var lige hurtigt nok lavet. :)

Nedenstående skulle gerne virke, forudsat at kalenderformatet kan genkendes. De tomme linjer fjernes også.

System.IO.TextReader sr = new System.IO.StreamReader(@"C:/Temp/Kalender.txt", System.Text.Encoding.GetEncoding("iso-8859-1"));

string contents = sr.ReadToEnd();
string[] lines = contents.Split(new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries);

var strongTypedLines = lines
  .Select(s => s.Split('\t'))
  .Select(s => new { Date = System.DateTime.Parse(s[0]), Name = s[1], Subject = s[2] });

foreach (var kalenderdata in strongTypedLines.OrderBy(item => item.Date))
{
  var kalenderDataToPrint = string.Format("{0} - {1} - {2}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject);

  graphic.DrawString(kalenderDataToPrint , new System.Drawing.Font("Arial", 18), new System.Drawing.SolidBrush(System.Drawing.Color.White), new System.Drawing.PointF(5.0f, 35.0f));
}
Avatar billede starf Nybegynder
04. oktober 2011 - 09:39 #17
du har ret i den ikke brokker sig over en tom linie til sidst, desværre kommer outputtet oven i hinanden, så skal have smidt noget string build ind:

            System.Text.StringBuilder minstreng = new System.Text.StringBuilder();
            foreach (var kalenderdata in strongTypedLines.OrderBy(item => item.Date))
            {
              minstreng.Append(string.Format("{0} - {1} - {2}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject));
              minstreng.Append(System.Environment.NewLine);
               
            }

hvilke ser ud til at virke perfekt.. smid et svar :)
Avatar billede starf Nybegynder
04. oktober 2011 - 10:04 #18
et lille spørgsmål, hvis man vil have noget tekst ind forand f.eks kalenderdata.subject, hvordan gør man det?
Avatar billede johny Nybegynder
04. oktober 2011 - 12:14 #19
I følgende linje:
minstreng.Append(string.Format("{0} - {1} - {2}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject));

er det bare "{0} - {1} - {2}" du skal erstatte med hvad du gerne vil have i stedet. {0} (til 2) er placeholders for de 3 argumenter der kommer efterfølgende. Men vil du gerne have en newline på, kan du også bare skrive følgende:

minstreng.Append(string.Format("{0} - {1} - {2}{3}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject, System.Environment.NewLine));

eller bedre endnu:
minstreng.AppendLine(string.Format("{0} - {1} - {2}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject));

alternativt:
minstreng.AppendFormat("{0} - {1} - {2}{3}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject, System.Environment.NewLine);
Avatar billede starf Nybegynder
04. oktober 2011 - 12:33 #20
jeg tænker mere hvis jeg gerne vil have noget ligende ud:

string.Format("{0} - {1} - {2}"Varrighed"{3}
Så ordet varrighed kommer før det sidste argument?
Avatar billede johny Nybegynder
04. oktober 2011 - 13:11 #21
string.Format("{0} - {1} - Varrighed: {2}{3}", kalenderdata.Date, kalenderdata.Name, kalenderdata.Subject, System.Environment.NewLine)

Som det er nu, er det første der skrives ud dog datoen, er det hvad du ønsker? Ellers er det nok nærmere:


string.Format("{0} - {1} - Varrighed: {2}{3}", kalenderdata.Name, kalenderdata.Subject, kalenderdata.Date, System.Environment.NewLine)
Avatar billede starf Nybegynder
04. oktober 2011 - 13:36 #22
mange tak... enkelt og elegant.. smid et svar :)
Avatar billede johny Nybegynder
04. oktober 2011 - 15:49 #23
I forhold til denne kommentar:
"jeg takker for hjælpen, ser ud til det virker som det skal nu.(måtte dog lave lidt om, så jeg brugte stringbuilder til at lave en stor string med hele resultatet i) Smid et svar :)"

Har du så 2 fungerende løsninger nu? :) For i så fald synes jeg da kun det er rimeligt at vi deler point'ene.
Avatar billede starf Nybegynder
04. oktober 2011 - 15:51 #24
ja, men det er din jeg bruger nu, da den ikke brokker sig over en tom linie.. men for min skyld ingen alarm hvis det er fint i deler med jer ?
Avatar billede johny Nybegynder
04. oktober 2011 - 16:26 #25
Hvis du i den anden løsning skifter følgende:
string[] myArray =  contents.Split(Environment.NewLine.ToCharArray()[0]) ;

ud med:

string contents = sr.ReadToEnd();
string[] myArray = contents.Split(new string[] { "\r\n" }, System.StringSplitOptions.RemoveEmptyEntries);

så virker den løsning også. :) Det jeg laver med at lave en linje om til typestærke objekter har ikke noget at gøre med at håndtere tomme linjer, men det bliver gjort i ovenstående kode.

Din kommentar om at det virkede og at han skulle smide et svar, kom bare samtidig med at jeg skrev min anden kommentar, for i så fald, kunne jeg bare have foreslået ovenstående rettelse. :)

Men her har du mit svar.

@sherlock: Ang. det med at kunne sortere tomme linjer fra med LINQ, så er det faktisk ret let. Har du et array af strings (MyArray), er koden blot:
MyArray.Where(s => !System.String.IsNullOrWhiteSpace(s));

(alternativt 's != ""' el. 's != System.String.Empty' hvis man bedre kan lide den syntaks)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester