webForumDet fria alternativet

Läsa textfil och splitta [avancerat]

.NET

6 svar · 375 visningar · startad av aleborg

Medlem sedan jan. 20013 341 inlägg
Frågan#1

Jag har en textfil fylld med poster som ser ut så här för varje post:

¤

12345678	Företaget AB
	Att: Sven Svensson				Telefon:	081231231
	Svenssonsväg 123     				Telefon2:	071231231
					Fax:	081231231
	123 45 Svensstad				E-post:	jag@domän.se
	

	Leveransadress:
					Telefon:	
					Telefon2:	
					Fax:	
	
	
	

	Referens:	 Sven Svensson   			Bet villk 	14
	Org.nr:	123123-1234			Lev villk 	
	Kundkateg    				Lev sätt:	Web
					Valuta:	SEK
					Språk:	SV
	Kravbrev:	Ja	Räntefakt  	Ja

	Exp.avgif  	Ja	Kravavgif  	Ja	Export:	Nej
	Frakt:	Ja

	Rabattavt   				Prislista 	1
					Fakturara   	 0,0
					Radrabatt 	 0,0

	Anmärknin  	
		

	Fordran:	        0,00
	Kreditgrä   	           0

		  Omsättning		       TB kr		TG %
	Nuv. år:	        0,00		        0,00		 0,0
	Föreg. år 	        0,00		        0,00		 0,0
Föreg. år 	        0,00		        0,00		 0,0

Jag behöver för varje post ha ut:
Kundnummer (första siffrorna efter ¤)
Företagsnamn
Förnamn (från referensen)
Efternamn (från referensen)
Adress
Postnummer
Stad
Telefon 1
Telefon2
Fax
Organisationsnummer
E-postadress
(Det kan hända att adressen befinner sig på samma ställe som "Att: ")

men jag har inte en aning om hur :(
Jag började med att försöka splitta upp filen i poster, en per rad:

			StreamReader stream = new StreamReader(@"C:\Kunder2.txt");
			string[] spcsfil = stream.ReadToEnd().Split(new char[] {'¤'}); 
			stream.Close();
			
			DataSet ds = new DataSet("spcs");
			DataTable dt = new DataTable("spcsTable");
			dt.Columns.Add("Raden");
			ds.Tables.Add(dt);
			foreach(string rad in spcsfil)
			{
				DataRow dr = dt.NewRow();
				dr["Raden"] = rad;
				dt.Rows.Add(dr); 
			}

			dataGrid1.DataSource = ds.Tables[0].DefaultView;

men det gick inget bra...
Någon som har lust att ge ett handtag? Har lite bråttom med det här :(

Medlem sedan apr. 20012 266 inlägg
#2

Regex kanske skulle kunna hjälpa dig, har tyvärr inget bra exempel på hur du får ut vissa specifika delar. Återkommer om jag hittar.

Medlem sedan sep. 20011 914 inlägg
#3

public class GetTabData : System.Web.UI.Page
{
   protected DataGrid dgData;
   private void Page_Load(object sender, System.EventArgs e)
   {
      if(!IsPostBack)
         Bind();
   }

   private void Bind()
   {
      dgData.DataSource = GetData();
      dgData.DataBind();
   }

   private CustomerCollection GetData()
   {
      string data = null;
      using(StreamReader sr = new StreamReader(Server.MapPath("fil.txt"), System.Text.Encoding.Default))
      {
         data = sr.ReadToEnd();
      }

      string[] posts = data.Split('¤');
      string reg = @"\n(\d*?)\t(.*?)\n\tAtt:.(.*?) (.*?)\t{4}.*?\t(.*?)\n\t(.*?)\t{4}.*?\t(.*?)\n\t{5}.*?\t(.*?)\n\t([\d ]*)(.*?)\t{4}E-post:.(.*?)\n.*Org.nr:.(.*?)\t";

      CustomerCollection cc = new CustomerCollection();
      foreach(string s in posts)
      {
         Match m = Regex.Match(s, reg, RegexOptions.Singleline);

         Customer c = new Customer();
         c.No = m.Groups[1].Value;
         c.Company = m.Groups[2].Value;
         c.FirstName = m.Groups[3].Value;
         c.LastName = m.Groups[4].Value;
         c.Phone1 = m.Groups[5].Value;
         c.Address = m.Groups[6].Value;
         c.Phone2 = m.Groups[7].Value;
         c.Fax = m.Groups[8].Value;
         c.Zip = m.Groups[9].Value;
         c.City = m.Groups[10].Value;
         c.Email = m.Groups[11].Value;
         c.OrgNo = m.Groups[12].Value;
         cc.Add(c);
      }

      return cc;
   }
        
   #region Web Form Designer generated code
   override protected void OnInit(EventArgs e)
   {
      InitializeComponent();
      base.OnInit(e);
   }

   private void InitializeComponent()
   {    
       this.Load += new System.EventHandler(this.Page_Load);
   }
   #endregion
}

    #region Class Customer
    public class Customer
    {
        #region Constructors
        public Customer()
        {

        }
        #endregion

        #region Property fields
        private string _address;
        private string _city;
        private string _company;
        private string _email;
        private string _fax;
        private string _firstname;
        private string _lastname;
        private string _no;
        private string _orgno;
        private string _phone1;
        private string _phone2;
        private string _zip;
        #endregion

        #region Properties
        public string Address
        {
            get{return _address;}
            set{_address = value;}
        }

        public string City
        {
            get{return _city;}
            set{_city = value;}
        }

        public string Company
        {
            get{return _company;}
            set{_company = value;}
        }

        public string Email
        {
            get{return _email;}
            set{_email = value;}
        }

        public string Fax
        {
            get{return _fax;}
            set{_fax = value;}
        }

        public string FirstName
        {
            get{return _firstname;}
            set{_firstname = value;}
        }

        public string LastName
        {
            get{return _lastname;}
            set{_lastname = value;}
        }

        public string No
        {
            get{return _no;}
            set{_no = value;}
        }

        public string OrgNo
        {
            get{return _orgno;}
            set{_orgno = value;}
        }

        public string Phone1
        {
            get{return _phone1;}
            set{_phone1 = value;}
        }

        public string Phone2
        {
            get{return _phone2;}
            set{_phone2 = value;}
        }

        public string Zip
        {
            get{return _zip;}
            set{_zip = value;}
        }
        #endregion

    }
    #endregion 
    
    #region CustomerCollection
    public class CustomerCollection : CollectionBase
    {
        public Customer this[int index]
        {
            get{return((Customer)List[index]);}
            set{List[index] = value;}
        }

        public int Add(Customer value)
        {
            return(List.Add(value));
        }

        public int IndexOf(Customer value)
        {
            return(List.IndexOf(value));
        }

        public void Insert(int index, Customer value)
        {
            List.Insert(index, value);
        }

        public void Remove(Customer value)
        {
            List.Remove(value);
        }

        public bool Contains(Customer value)
        {
            return(List.Contains(value));
        }
    }
    #endregion
Medlem sedan juni 20019 024 inlägg
#4

Dino, har du lite att göra eller? :e

Medlem sedan apr. 20012 266 inlägg
#5

Tummen upp för Dino!

(precis så jag menade :e)

Medlem sedan jan. 20013 341 inlägg
#6

Tack Dino!
Det funkar bra på små filer men tyvärr inte på en fil på ca 900 KB samt att fälten blir lite fel, jag har följande kod som går lite snabbare men tyvärr blir det fel på för- och efternamn pga att namnen ibland är felskrivna, t ex kan Per-Erik vara skrivet Per - Erik och ibland är det dubbla mellanslag mellan för- och efternamn.

Koden är ganska enkel, men det här ska bara användas en gång för att vi ska kunna byta ekonomiprogram.

			StreamReader stream = new StreamReader(@"C:\Kunder.txt",System.Text.Encoding.GetEncoding("iso-8859-1"));
			string[] spcsfil = stream.ReadToEnd().Split('?'); 
			stream.Close();
			
			DataSet ds = new DataSet("spcs");
			DataTable dt = new DataTable("spcsTable");
			dt.Columns.Add("Kundnummer");
			dt.Columns.Add("Foretag");
			dt.Columns.Add("Adress");
			dt.Columns.Add("Telefon");
			dt.Columns.Add("Fax");
			dt.Columns.Add("Mobil");
			dt.Columns.Add("Postnummer");
			dt.Columns.Add("Ort");
			dt.Columns.Add("Epost");
			dt.Columns.Add("Fornamn");
			dt.Columns.Add("Efternamn");
			dt.Columns.Add("Orgnummer");
			ds.Tables.Add(dt);

			string[] namn=null;
			foreach(string rad in spcsfil)
			{
				string[] fields = rad.Split('\t');
				DataRow dr = dt.NewRow();
				dr["Kundnummer"] = fields[0].Replace("\r\n","").Trim();
				dr["Foretag"] = fields[1].Trim();
				if(fields[2].ToLower().StartsWith("att:"))
					dr["Adress"] = fields[8].Trim();
				else
					dr["Adress"] = fields[2].Trim();
				dr["Telefon"] = fields[7].Trim();
				dr["Fax"] = fields[19].Trim();
				dr["Mobil"] = fields[13].Trim();
				if(fields[20].Length>1)
				{
					dr["Postnummer"] = fields[20].Substring(0,6).Trim();
					dr["Ort"] = fields[20].Substring(6).Trim();
				}
				dr["Epost"] = fields[25].Trim();
				
				if(fields[50].Trim().Length>1)
				{
					namn = fields[50].Trim().Split(' ');
					dr["Fornamn"] = namn[0];
					try
					{
						dr["Efternamn"] = namn[1];
					}
					catch
					{
						dr["Efternamn"] = "";
					}
					dr["Orgnummer"] = fields[56].Trim();
				}
				dt.Rows.Add(dr); 
			}

			dgData.DataSource = ds.Tables[0].DefaultView;

Var även tvungen att byta ut ¤ mot ? för att det först inte fungerade att använda ¤ som skiljetecken mellan posterna.
Hjälp med för- och efternamn tages emot tacksamt.

Medlem sedan sep. 20011 914 inlägg
#7

Synd att det inte funkade som det skulle. För mig tar regexet ut den datan du vill ha, men det är extremt segt på större filer. Har ingen aning varför.

267 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)