Diskuze: Jak číst odděleně slova z txt file
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Jan Vargovský:28.6.2014 13:58
Můžeš číst po znaku nebo řádku. Buď si načteš celý soubor, ten rozsplituješ (string.Split(...)), vyleze ti z toho pole a s tím si už můžeš dělat co chceš.
string[] slova = File.ReadAllText("foo.txt", Encoding.Default)
.Split(new string[] { Environment.NewLine, ",", " " }, StringSplitOptions.RemoveEmptyEntries);
foreach (string slovo in slova)
{
Console.ReadKey(true);
Console.WriteLine(slovo);
}
Takhle je třeba načtení z konzole.
Jan Vargovský:28.6.2014 14:07
Btw první jsi psal o rozdělení slov pomocí mezery, nakonec jsi tam dal
čárky
Velice děkuji za tvojí odpověd.Mám zde jednu chybu že "file" neexistuje v tomto kontextu.A ještě jedna otázka to "foo.txt" jak se dá nahradit txt z resources?
PS:Ty čárky jsem tam psal pro zpřehlednění:)
KlimiCZ:28.6.2014 14:34
1,Je tu tlačítko odpovědět.
2,Nemáš zač
3,Jde to i ,když na to zmáčkneš pravým tlačítkej tak je to první odkaz a
tam ti to napíše
Pripadne kdybys mel na jednom radku jedno slovo, tak muzes pouzit
File.ReadAlllines
Jan Vargovský:28.6.2014 17:26
int[][] matice = File.ReadAllLines("foo.txt")
.Select(row => row.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n))
.ToArray())
.ToArray();
var lines = File.ReadAllLines("foo.txt");
int[,] matice2 = new int[3, 3];
for (int row = 0; row < lines.Length; row++)
{
var rowNumbers = lines[row].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n)).ToArray();
for (int column = 0; column < 3; column++)
matice2[row, column] = rowNumbers[column];
}
Chceš asi tu druhou možnost, ale jak chceš. U té je blbé, že ten kód je dost nafouklý, protože musíš předem říct jak to pole bude veliké a kdybys to chtěl dynamické, tak tam je i celkem redundantní kód.
Jan Vargovský:28.6.2014 17:31
var lines = File.ReadAllLines("foo.txt");
int columns = lines[0].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Length;
int[,] matice2 = new int[lines.Length, columns];
for (int row = 0; row < lines.Length; row++)
{
var rowNumbers = lines[row].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n)).ToArray();
for (int column = 0; column < columns; column++)
matice2[row, column] = rowNumbers[column];
}
Ještě jsem to rychle udělal no šlo by to asi napsat lépe, ale momentálně na to nemám čas.
KlimiCZ:28.6.2014 17:38
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: Vstupní řetězec nemá správný formát.
u
var rowNumbers = lines[row].Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n)).ToArray();
Jan Vargovský:28.6.2014 17:39
Já to testoval na tomto
1 2 3 3
4 5 6 1
7 8 9 2
10 11 12 5
18 12 3 4
A funguje to normálně.
Si to kdyžtak uprav, já nevím jak vypadá ta tvoje mapa...
Jan Vargovský:28.6.2014 17:41
Tak jednotlivé řádky splituješ pomocí "," a né " ".
KlimiCZ:28.6.2014 17:43
Mám ještě jeden dotaz.
Když to chci dáti do .dll jako funkci static - tak to se mi asi nevytvoří to
int[,].
jak by to šlo udělat ?
Zdravím,moc děkuji za výpomoc toto fórum budu jistě doporučovat ale
mám ještě jednu otázku,když chci aby si uživatel mohl určit jaký txt
soubor mu to bude načítat tak jak to mám udělat
V podstatě to upravit aby to fungovalo takto
string[] slova = File.ReadAllText("*C:\Users\Já\Documents\Nákup.txt*", Encoding.Default)
.Split(new string[] { Environment.NewLine, ",", " " }, StringSplitOptions.RemoveEmptyEntries);
KlimiCZ:28.6.2014 18:02
ve windows form by to bylo
string[] slova = File.ReadAllText(tbLOLOL.Text, Encoding.Default)
.Split(new string[] { Environment.NewLine, ",", " " }, StringSplitOptions.RemoveEmptyEntries);
tbLOLOL - textbox a myslím ,že to jde i přes open dialog
http://www.itnetwork.cz/…orms-dialogy
KlimiCZ:28.6.2014 18:04
Dialog je
if (folderBrowseDialog1.ShowDialog() == DialogResult.OK)
{
string text = folderBrowserDialog1.SelectedPath;
}
pak to bude vypadat
if (folderBrowseDialog1.ShowDialog() == DialogResult.OK)
{
string text = folderBrowserDialog1.SelectedPath;
}
string[] slova = File.ReadAllText(text, Encoding.Default)
.Split(new string[] { Environment.NewLine, ",", " " }, StringSplitOptions.RemoveEmptyEntries);
KlimiCZ:28.6.2014 18:10
tak na for si přidej OpenFileDialog
a
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
string textt = openFileDialog1.FileName;
}
string[] slova = File.ReadAllText(textt, Encoding.Default)
.Split(new string[] { Environment.NewLine, ",", " " }, StringSplitOptions.RemoveEmptyEntries);
PS: předtím to b ylo špatně to vybíralo složku
Jan Vargovský:28.6.2014 18:23
Vytvoříš projekt typu Class Library. Uděláš tam veřejnou třídu, do ní narveš tu metodu, zkompiluješ, pak už si to jen někde v projektu nalinkuješ a využíváš (pracuje se s tím už jako s každou knihovnou z .NET frameworku)
Jan Vargovský:28.6.2014 18:27
Zkus si nejdříve rozmyslet co napíšeš a napsat to v jedné zprávě.
Nevím co je to za soubor, stahovat to nebudu (už vůbec ne v raru), protože absolutně nevím, co bych s tím měl dělat.
KlimiCZ:28.6.2014 18:30
projekt já to mam jako static třídu jako public static metodu, ale jak to z toho vytáhnu ?
Jan Vargovský:28.6.2014 18:34
Normalně v projektu si nalinkuješ (References -> Add reference -> vybereš jí a potvrdíš) a pak jí využíváš tak jako všechny ostatní knihovny. Buď nahoru dáš using a nebo prostě v kódu napíšeš
NazevKnihovny(default).NazevTridy.NazevMetody
EDIT: Dívám se na ten projekt a tam to máš dobře.
KlimiCZ:28.6.2014 19:58
Ale pořád jsi mi neodpověděl jak to mám vytáhnout to int[,]
KlimiCZ:28.6.2014 20:05
Dobře popíši jinak.
Ve Form1.cs potřebuji dískat to co se vygenerovalo v dll.
Ale jak to mám získat?
Takhle to nejde
dejobrazy(Mapa.map.generujzfoo());
KlimiCZ:28.6.2014 20:11
public static void generujzfoo()
{
var lines = File.ReadAllLines("map1.mapx");
int columns = lines[0].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Length;
int[,] pole = new int[lines.Length, columns];
for (int row = 0; row < lines.Length; row++)
{
var rowNumbers = lines[row].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n)).ToArray();
for (int column = 0; column < columns; column++)
pole[row, column] = rowNumbers[column];
}
}
private void dejobrazy(int[,] pol)
{
#region p1
switch (pol[0,0])
{
case 0:
pictureBox1.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox1.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox1.Image = Properties.Resources.zed;
break;
}
switch (pol[0, 1])
{
case 0:
pictureBox2.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox2.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox2.Image = Properties.Resources.zed;
break;
}
switch (pol[0, 2])
{
case 0:
pictureBox3.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox3.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox3.Image = Properties.Resources.zed;
break;
}
switch (pol[0, 3])
{
case 0:
pictureBox4.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox4.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox4.Image = Properties.Resources.zed;
break;
}
switch (pol[0, 4])
{
case 0:
pictureBox5.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox5.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox5.Image = Properties.Resources.zed;
break;
}
#endregion
#region p2
switch (pol[1, 0])
{
case 0:
pictureBox6.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox6.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox6.Image = Properties.Resources.zed;
break;
}
switch (pol[1, 1])
{
case 0:
pictureBox7.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox7.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox7.Image = Properties.Resources.zed;
break;
}
switch (pol[1, 2])
{
case 0:
pictureBox8.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox8.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox8.Image = Properties.Resources.zed;
break;
}
switch (pol[1, 3])
{
case 0:
pictureBox9.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox9.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox9.Image = Properties.Resources.zed;
break;
}
switch (pol[1, 4])
{
case 0:
pictureBox10.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox10.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox10.Image = Properties.Resources.zed;
break;
}
#endregion
#region p3
switch (pol[2, 0])
{
case 0:
pictureBox11.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox11.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox11.Image = Properties.Resources.zed;
break;
}
switch (pol[2, 1])
{
case 0:
pictureBox12.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox12.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox12.Image = Properties.Resources.zed;
break;
}
switch (pol[2, 2])
{
case 0:
pictureBox13.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox13.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox13.Image = Properties.Resources.zed;
break;
}
switch (pol[2, 3])
{
case 0:
pictureBox14.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox14.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox14.Image = Properties.Resources.zed;
break;
}
switch (pol[2, 4])
{
case 0:
pictureBox15.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox15.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox15.Image = Properties.Resources.zed;
break;
}
#endregion
#region p4
switch (pol[3, 0])
{
case 0:
pictureBox16.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox16.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox16.Image = Properties.Resources.zed;
break;
}
switch (pol[3, 1])
{
case 0:
pictureBox17.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox17.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox17.Image = Properties.Resources.zed;
break;
}
switch (pol[3, 2])
{
case 0:
pictureBox18.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox18.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox18.Image = Properties.Resources.zed;
break;
}
switch (pol[3, 3])
{
case 0:
pictureBox19.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox19.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox19.Image = Properties.Resources.zed;
break;
}
switch (pol[3, 4])
{
case 0:
pictureBox20.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox20.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox20.Image = Properties.Resources.zed;
break;
}
#endregion
#region p5
switch (pol[4, 0])
{
case 0:
pictureBox21.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox21.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox21.Image = Properties.Resources.zed;
break;
}
switch (pol[4, 1])
{
case 0:
pictureBox22.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox22.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox22.Image = Properties.Resources.zed;
break;
}
switch (pol[4, 2])
{
case 0:
pictureBox23.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox23.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox23.Image = Properties.Resources.zed;
break;
}
switch (pol[4, 3])
{
case 0:
pictureBox24.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox24.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox24.Image = Properties.Resources.zed;
break;
}
switch (pol[4, 4])
{
case 0:
pictureBox25.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox25.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox25.Image = Properties.Resources.zed;
break;
}
#endregion
}
Jan Vargovský:28.6.2014 20:24
Napíšu ti odpověď, aby jsi pořád nespammoval. Metoda void nic nevrací (kromě vyjímky), ta se prostě zavolá a nic jinačího od ní nečekej. Snažíš se z té void metody vytřískat svojí načtenou mapu, ale vůbec to nejde. Snažíš se to dávat do knihovny for no reason, i když neumíš napsat ani normální funkci:
public static int[,] generujzfoo()
{
var lines = File.ReadAllLines("map1.mapx");
int columns = lines[0].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Length;
int[,] pole = new int[lines.Length, columns];
for (int row = 0; row < lines.Length; row++)
{
var rowNumbers = lines[row].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n)).ToArray();
for (int column = 0; column < columns; column++)
pole[row, column] = rowNumbers[column];
}
return pole;
}
Tu velkou špagetu s pictureboxy by šlo taky zredukovat na 2 cykly. Až dohraju a možná si vzpomenu, tak ti to pošlu.
Jan Vargovský:28.6.2014 20:27
Stačí si ty pictureboxy hodit taky do 2d pole a pak jen budeš iterovat a indexovat picturebox[x,y] = mapa[x,y]
Jan Vargovský:28.6.2014 20:31
Jako první si to minimalizuj třeba tak, že si napiš metodu, které předáš picturebox + políčko mapy a podle toho tam nastavíš ten obrázek.
switch (pol[4, 4])
{
case 0:
pictureBox25.Image = Properties.Resources.prazdny;
break;
case 1:
pictureBox25.Image = Properties.Resources.hrac;
break;
case 2:
pictureBox25.Image = Properties.Resources.zed;
break;
}
=>
NastavObrazek(pictureBox25.Image, pol[4,4]);
pomocí nějaké takové metody
private void NastavObrazek(PictureBox pb, int n)
{
switch (n)
{
case 0:
pb.Image = Properties.Resources.prazdny;
break;
case 1:
pb.Image = Properties.Resources.hrac;
break;
case 2:
pb.Image = Properties.Resources.zed;
break;
}
}
nebo třeba takhle
pictureBox25.Image = VratObrazek(pole[4,4]);
pomocí
private Image VratObrazek(int n)
{
switch (n)
{
case 0:
return = Properties.Resources.prazdny;
break;
case 1:
return Properties.Resources.hrac;
case 2:
return Properties.Resources.zed;
}
}
KlimiCZ:28.6.2014 21:53
hele a kde jsi vzal to pol ? já mám jen Mapa.mapblablabla() jak z toho udelam int[,]
Zdravím jsem to zase já
Mám problém s tím jak rozdělit text písmeno od písmene zkoušel jsem tento
kód ten bohužel nefunguje:
string[] text = File.ReadAllText(cesta,Encoding.Default)
.Split(new string[] { Environment.NewLine,"" }, StringSplitOptions.RemoveEmptyEntries);
Zobrazeno 48 zpráv z 48.