sawMedlem sedan mars 20011 880 inlägg Jag måste tyvärr besvära er igen.
Jag har en stor textfil(ca 3 mb) som i stort ser ut så här.
"abilities_effect_text_can_assassinate" "Can undertake assassination missions." "False"
"abilities_effect_text_can_attack_land" "Can instigate land battles." "False"
"abilities_effect_text_can_attack_naval" "Can instigate naval battles." "False"
"abilities_effect_text_can_build_fort" "Can construct fort." "False"
"abilities_effect_text_can_build_religious" "Can construct mission." "False"
I första steget så ville jag läsa in det som står mellan de två första cittattecknen(").
Jag försöker så här
Regex exp = new Regex("?????",RegexOptions.IgnoreCase);//<---här vet jag inte
MatchCollection MatchList = exp.Matches(filnamnet);
Match FirstMatch = MatchList[0];
Group GroupCurrent;
for (int i = 1; i < FirstMatch.Groups.Count; i++)
{
GroupCurrent = FirstMatch.Groups[i];
if (GroupCurrent.Success)
{
comboBox1.Items.Add(GroupCurrent.Value);
}
}
Problemet är att jag inte vet hur jag skall skriva min regex för att enbart ha
med det första blocket( det finns alltid tre block). Hur jag sen skall fortsätta
det är jag osäker på, men jag tror det ger sig.
För övrigt så tror jag att jag är på rätt väg, eller...
GunnarDMedlem sedan juni 20014 290 inlägg Borde fungera med /\"(.*?)\"/ för att få första delen.
Regex är normalt "greedy" och vill ta så mycket som möjligt, men om man sätter ett frågetecken efter * så blir uttrycket "non greedy".
Ex:
apapa med uttrycket a.*a matchar apapa
apapa med uttrycket a.*?a matchar apa
är det varje rad du är intresserad över?
eller är det varje citat?:
"\"[^\"]+\""
är din sträng för att fånga alla, om det inte är så att det kan vara så att den innehåller:
"hej \"test\"" i din text fil? då kan:
"\".*?\""
passar dig bättre?
sawMedlem sedan mars 20011 880 inlägg I första läget ville jag ha ut det första blocket i varje rad.
Det verkar dessvere som om min kod är galen jag får följande error:
Det angivna argumentet hamnade utanför intervallet med giltiga värden.
Parameternamn: i
Oavsett vilket av era förslag som jag försöker med.
Uttrycket är korrekt om det är alla citat du vill få ut.
MatchCollection allMatchResults = null;
try {
Regex regexObj = new Regex("\".*?\"", RegexOptions.IgnoreCase);
allMatchResults = regexObj.Matches(subjectString);
if (allMatchResults.Count > 0) {
// Access individual matches using allMatchResults.Item[]
} else {
// Match attempt failed
}
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}
säger regexpbuddy i c# att det kan se ut.
sawMedlem sedan mars 20011 880 inlägg Nu är jag troligen väldigt dum , men jag behöver ladda en combobox med det.
if (allMatchResults.Count > 0)
{
// Access individual matches using allMatchResults.Item[]
comboBox1.Items.Add(allMatchResults.text);
}
Här händer ingenting...
är allMatchResults.Count 0?
sawMedlem sedan mars 20011 880 inlägg Japp, ja la in en messagebox och kollade..
FEL AV MIG.
Nu får jag
System.Text.RegularExpressions.MatchCollection
Jag gör allstå fel när jag skall ladda comboboxen.(se ovan).
sawMedlem sedan mars 20011 880 inlägg Nu har jag ändrat en del och jag har fått första raden, men hur fortsätta så
jag får med alla?
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
MatchCollection MatchList = exp.Matches(allRead);
Match FirstMatch = MatchList[0];
Group GroupCurrent;
for (int i = 0; i < FirstMatch.Groups.Count; i++)
{
GroupCurrent = FirstMatch.Groups[i];
if (GroupCurrent.Success)
{
comboBox1.Items.Add(GroupCurrent.Value);
}
}
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase | RegexOptions.Multiline);
sawMedlem sedan mars 20011 880 inlägg Tyvärr så hjälpte inte det heller :-(
BrimbaMedlem sedan dec. 19995 875 inlägg Det borde vara något i stil med
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
MatchCollection MatchList = exp.Matches(allRead);
foreach (Match match in MatchList){
Group GroupCurrent;
for (int i = 0; i < match.Groups.Count; i++)
{
GroupCurrent = match.Groups[i];
if (GroupCurrent.Success)
{
comboBox1.Items.Add(GroupCurrent.Value);
}
}
}
Men eftersom du bara är ute efter en specifik grupp så borde det räcka med typ
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
MatchCollection MatchList = exp.Matches(allRead);
foreach (Match match in MatchList){
if (match.Groups[1].Success){
comboBox1.Items.Add(match.Groups[1].Value);
}
}
sawMedlem sedan mars 20011 880 inlägg Hej Brimba.
Jag har testat dina bägge förslag, och de lägger till i comboboxen, men de lägger till allt.
Jag blev tvungen att ändra lite för att få någon text alls
Regex exp = new Regex("\".*?\"", RegexOptions.IgnoreCase);
MatchCollection MatchList = exp.Matches(allRead);
foreach (Match match in MatchList)
{
if (match.Groups[0].Success)
{
comboBox1.Items.Add(match.Groups[0].Value);
}
}
Texten ser ju ut så här:
"abilities_effect_text_can_assassinate" "Can undertake assassination missions." "False"
"abilities_effect_text_can_attack_land" "Can instigate land battles." "False"
"abilities_effect_text_can_attack_naval" "Can instigate naval battles." "False"
"abilities_effect_text_can_build_fort" "Can construct fort." "False"
"abilities_effect_text_can_build_religious" "Can construct mission." "False"
"abilities_effect_text_can_convert" "Enables religious conversion." "False"
.. och då är det bar t ex
"abilities_effect_text_can_assassinate"
"abilities_effect_text_can_attack_land"
"abilities_effect_text_can_attack_naval" //osv
.. som jag vill ha i comboboxen.
sawMedlem sedan mars 20011 880 inlägg Den första delen har jag lyckats att klara ut, tyvärr inte med regex men..
Application.DoEvents();
int counter = 0;
string line;
try
{
StreamReader file = new StreamReader(filnamnet);
while ((line = file.ReadLine()) != null)
{
searthText = line.Split('"');
comboBox1.Items.Add(searthText[1]);
counter++;
Application.DoEvents();
}
file.Close();
Application.DoEvents();
}
catch(Exception fel)
{
MessageBox.Show(fel.Message);
}
finally
{
toolStripStatusSum.Text = counter.ToString();
}
Nu får jag det snyggt och prydligt. Nästa bit kräver nog regex, då skall jag
kunna klicka i comboboxen och få upp den nästföljande text i en textbox.
Tips???
[REDIGERAT]
Jag har nu fått allting att fungera dock inte med regex utan gammal hederlig strängmanupilation.
Jag tänkte visa er, den ovan koden fungerar bra, sedan
//när comboboxen ändras
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex > -1)
{
int i = comboBox1.SelectedIndex + 1;
textBox1.Text = readLine(filnamn,i);
}
else
MessageBox.Show("Inget index");
}
//..så visar jag upp den här
private static string readLine(string filnamn,int lineNr)
{
string sText = "";
using (StreamReader sr = new StreamReader(filnamn))
for (int i = 0; i < lineNr; i++)
{
sText = sr.ReadLine();
if (sText == null) break;
}
string[] newText = sText.Split('"');
return newText[3];
}
Totalt så är det 33023 rader. Frågan är nu, i textfilen så är ju allt omgivna av citterationstecken, skall jag göra det i comboboxen och i textboxen.
Sen det viktigaste hur skall jag spara, när jag har plockat fram ett radnummer och ändrat det?
Väldigt tacksam för alla tips.