Odczyt słów z pliku i zapis do textbox

0

Witam.
Prosiłbym o pomoc w programie C# (Windows Forms Application). Mianowicie chciałbym zrobić prosty programik,
który odczyta plik .txt i wyświetli jego "słowa" w Form1 (np. w automatycznie wygenerowanych textbox-ach).
Plik txt posiada dane np.

1,coś tam,"zakupy", 25.49,[NAGŁÓWEK]
"PW",2.88/152,ZATWIERDZONY

dane są pooddzielane przecinkiem ",".
Siedzę nad tym już trzeci dzień i nic nie mogę stworzyć :(
Oto co udało mi się skleić :/
plik otwieram OpenFileDialog-iem i mam przykładowo 1 linię z 18 danymi.

private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog okienko = new OpenFileDialog();
            okienko.Filter = "Pliki (txt)|*.txt"; // format otwieranego pliku

            if (okienko.ShowDialog() == DialogResult.OK)
            {
                MessageBox.Show("Wybrano plik: " + okienko.FileName); // akceptacja pliku
                
            }

            using (StreamReader reader = new StreamReader(okienko.FileName))
            {
                string line;
                this.tableLayoutPanel1.Controls.Clear(); // czyszczenie kontrolek
              
                while ((line = reader.ReadLine()) != null)
                {
                    
                        string[] data = line.Split(','); // odczytanie słowa do momentu przerwania ","

                            for (int u = 0; u <= 17; u++) 
				// 18 elementów <------- a chciałbym żeby automatycznie przeliczał ile słow jest w lini
                            {
                                TextBox txt = new TextBox();
                                txt.Name = String.Format("txt{0}", (u+1)); 
				// (u+1)  czyli zaczynanie od textBox1, bo u = 0 i też nie jestem pewien czy to dobry pomysł
                                txt.Text = data[u]; // wczytanie słowa
                               
                                this.tableLayoutPanel1.Controls.Add(txt, (u+1),0); // dodanie textbox-a do tableLayoutPanel1
                            }  
                }
            }
             
        }
 

Do wyświetlenia użyłem tableLayoutPanel i wyświetla mi tylko pierwszego textbox-a z pierwszą daną :(
Chciałbym żeby dostęp do danych był jak najłatwiejszy (np. dana 1 = textBox1, dana 2 = textBox2 itp.)
Proszę o pomoc.

0

Na pierwszy rzut oka wszystko wygląda ok. Rozumiem, że panel jest na tyle duży, żeby zmieścić te kontrolki? I też panel w którym się ten znajduje?
Co do pętli to wystarczy w warunku umieścić: u < dane.Length

0

Kontrolka tableLayoutPanel1 ma ustawioną wartość AutoScroll (true).
Wyświetla pierwszy textbox z pierwszym słowem, ale następne textbox-y są dużo niżej :/
Nie wiem dlaczego nie wyświetla wszystkich textbox-ów w kolumnie jeden po drugim tylko pierwszy na górze, a resztę od dołu :/

0

RowCount i GrowStyle masz dobrze ustawione? Próbowałeś zmieniać RowStyles dla dodawanych wierszy?

0

GrowStyle ustawione jest na "AddRows", a RowCount " 1".
Nie wiem dokładnie jak to działa próbowałem metodą prób i błędów, ale bez skutku :(
Może jest jakaś inna łatwiejsza metoda rozwiązania mojego problemu?
Proszę o pomoc.

0

może lepiej użyć komponentu typu ListView czy nie wiem jak to w c# się nazywa

0

Witam

Prawdopodobnie może się rozjeżdżać właśnie przez to (u+1)

 this.tableLayoutPanel1.Controls.Add(txt, (u+1),0) 

Jeśli u to ma być nr kolumny to powinno wyglądać to tak:

 this.tableLayoutPanel1.Controls.Add(txt, u ,0) 

Pozdrawiam
Marcin

0

To tez nie działa :(
Stworzyłem ręcznie textbox-y w formatce, a słowa (dane) przypisałem do tablicy.
Teraz mój problem polega na tym, żeby nie wypisywać pojedyńczo
textBox1.Text = slowo[0];
textBox2.Text = slowo[1]; itp
tylko użyć jakiejś petli, by wczytała sama nazwy textbox-ów i przypisała do nich kolejno słowa coś w stylu

for (int i = 0; i<10;i++) 
{ 
textBox(i).Text = slowo[i] 
}

Nie wiem jak zrobić podobnie działającą pętlę. Błagam o pomoc :(

0

Powinno działać i wyświetlać się także równo.

            string[] tab={"asdasd","3274","asd3@#$","ASD#%#$","sdjsj","jsak","rterte","asdasd","wer","ortp"};
            for (int i = 0; i < 10; i++)
            {
                TextBox txt = new TextBox();
                //txt.Name = "asdasd";
                this.tableLayoutPanel1.Controls.Add(txt, i, 0);
                this.tableLayoutPanel1.AutoSize = true;
                this.tableLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowOnly;
                txt.Text = tab[i];
                TableLayoutRowStyleCollection styles=this.tableLayoutPanel1.RowStyles;               
                foreach (RowStyle style in styles)
                {
                    style.SizeType = SizeType.AutoSize;
                }
            }
 
0

Tylko, że wszystkie textboxy są umieszczone na tabControl1.

0

Następny problem z edycją plików to zapis danych z textbox-ów do pliku .txt
A żeby nie było łatwo, to każde dane mają mieć określoną długość znaków (spacja to też znak) np.
W programie mam 3 textBox-y z danymi:

textBox1 = "Warszawa"; (8 znaków)
textBox2 = "Park Miejski Lato" (17 znaków)
textBox3 = "MSK\001\65" (10 znaków)

I problem polega na zapisaniu tych danych (oczywiście jest ich dużo więcej) do pliku txt z odpowiednią ilością znaków do zapisania np
plik txt wyglądać powinien w ten sposób:

w teorii:
Miasto ( max 20 znaków)
Miejsce( max 20 znaków)
Numer ( 10 znaków)

w praktyce:
**Warszawa++++++++++++ Park Miejski Lato+++ MSK\001\65 **
( znak (+) oznacza spację) Każde słowo w pliku musi mieć określoną długość znaków( może być miej ale nie więcej) i oddzielone jest spacją.

Trochę to zagmatwane, ale chcę wyciągnąć dane z jednego pliku i posklejać te dane w plik txt, do odczytu z innego programu.
Jeżeli komuś wpadnie coś do głowy, to baaaardzo proszę o pomoc.
Dziękuje za dotychczasowe podpowiedzi i mam nadzieję, że ktoś wpadnie na rozwiązanie tego szalonego pomysłu :)

0

To co potrzebujesz to System.String.Format:
http://msdn.microsoft.com/en-us/library/system.string.format(v=vs.100).aspx
zobacz przykłady na dole strony

0

Mam plik a w nim:
[NAGLOWEK]
"1.05",Kalisz,Miasto Kalisz,"MST\005\012",MAG,Magazyn główny,20120726141026, Wyszyńskiego
25a/2 Piła 12-422, Jan Kowalski

I chcę każde słowo z tego pliku przypisać do odpowiedniego textBox-a przypisanego na sztywno do Form1.
Chce ominąć słowo [NAGLOWEK] a resztę słów przypisać. HELP ...

0

Dzień dobry.
Mam następny problem :/
Mianowicie mam plik (.txt) w którym jest duuużo wierszy, ale każdy wiersz posiada swój schemat
Przykład:

[INFO]
"1.0.5",,,"Program","Stacja', ...

[NAGLOWEK]
"FS",1,0,1254,"0001/01/2012",,,"PRZYKŁADOWA STACJA", ...

[ZAWARTOSC]
"23",23.0000,138.2100,50.49, ...

[NAGLOWEK]
"WZ",1,0,1250,"952/13/2011"4.5,"AAA", ...

[ZAWARTOSC]

[NAGLOWEK]
"FZ",1,0,1250,"Stacja Bazowa", ...

[ZAWARTOSC]
"23",23.0000,202.5200,11.8500, ...

i w programie chcę wyciągnąć tylko wiersze, które zaczynają się słowem "FS" i wiersze [ZAWARTOSC] im odpowiadające, czyli z przykładu

"FS",1,0,1254,"0001/01/2012",,,"PRZYKŁADOWA STACJA",
"23",23.0000,138.2100,50.49,

Nie wiem jak się za to zabrać :(
Próbowałem stworzyć tablicę string-ów i przypisać im każdą linijkę, ale nie wiem jak wyciągnąć z tej tablicy wiersze zaczynające się na "FS" i ich zawartości.
Bardzo proszę o pomoc i dziękuje za dotychczasowe rozwiązania :)
Czekam z niecierpliwością na pomysły.

0

Weź sobie przejrzyj listę metod: http://msdn.microsoft.com/en-us/library/system.string.aspx
To jest podstawa w pracy z tekstem w C#.

W skrócie:

string[] linesWithFS = lines.Where(s=>s.StartsWith("\"FS")).ToArray();
0

Udało mi się zmodzić takie coś:

 
private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear(); // Czyszczenie listBox1
            StreamReader reader = new StreamReader(path, Encoding.GetEncoding("ISO-8859-2"));//odczyt strumienia
            string tekst = reader.ReadToEnd();//zmienna tekst = caly tekst w pliku
            string[] linia = new string[0];// tablica linia
            if (tekst != null)
            {
                //Czyta do końca pliku
                linia = tekst.Split(new string[] { "", "[", "]" }, StringSplitOptions.None);
                //Oddziela poszczególne linie delimiterem ("","[","]")
            }
            for (int i = 0; i < linia.Length; i++)
            {
                listBox1.Items.Add(linia[i]);// wyświetla linie w listBox1
            }
        }

W kontrolce listBox1 wyświetla mi wszystkie linie jedna pod drugą. Nadal nie wiem jak wyszukać z nich te z przypisem "FS" i linie do niej odpowiadające :(
Proszę rzućcie okiem na kod. Może źle podchodzę do problemu?
Czekam na sugestie.

0

Ten kod iteruje po wszystkich liniach i sprawdza czy zaczyna się od FS

            string[] lines = File.ReadAllLines("plik"); //wczytaj wszystkie linie
            foreach (string line in lines)
            {
                if (line.StartsWith("FS"))
                {
                    //linia zaczyna się od FS
                }
                else
                {
                    //linia nie zaczyna się od FS
                }
            }
0

Ok. Działa. Wszystkie linijki zaczynające się "FS" są dodawane jak na razie do listBox1:
Kod

string[] lines = File.ReadAllLines(path ,Encoding.GetEncoding("ISO-8859-2")); //wczytaj wszystkie linie
            
            foreach (string line in lines)
            {
                if (line.StartsWith("\"FS\""))
                {
                   
                    listBox1.Items.Add(line);
                }
                else
                {
                    //linia nie zaczyna się od FS
                }
            }
 

Ale jeszcze chcę, żeby po wczytaniu linii "FS" opuścił 2 linijki i wczytał trzecią

[NAGLOWEK]
"FS", ...

[ZAWARTOSC]
"23",23.0000, ...

Dziękuję serdecznie za dotychczasowe pomysły :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1