16. november 2010 - 12:05Der er
27 kommentarer og 1 løsning
Tekst filer (.txt) - læsning samt indhold af teksten.
Hej!
Hvis jeg skal læse fra en tekst fil og der står f.eks.:
Tosse Bandit
Og jeg har en string som måske hedder: string test = "Hej Tosse, du ser godt ud."; Så skal den komme med en fejl, fordi "Tosse" er i en string og står i en tekst fil. Kan måske fornemme, at man skal bruge IndexOf, men er ikke sikker.
Selvfølgelig, hvis der bare står: string test = "Hej Jørgen, du ser godt ud"; Så skal der intet ske :o)
Hmm kan ikke helt følge dig, skal du kun vide hvordan du tjekker for om Tosse står i en streng, eller skal du vide hvordan man læser en fil, eller er begge?
Du kan nemt indlæse en mindre fil i en List på denne måde:
List<string> linier = new List<string>(); linier.AddRange(File.ReadAllLines(@"C:\Filnavn.txt")); foreach (string linie in linier) { if (linie.Contains("Tosse")) throw new Exception("Tosse må ikke bruges!"); }
Ved ikke om det kan bruges, ellers må du lige forklare bedre.
Det er meget pænt af dig med den kode der, men igen står "Tosse" i koden.
Det er ikke det jeg umiddelbart skal bruge, skal bare bruge en kode. Der kan finde de ord som står i ord.txt og hvis en string indholder nogen af de ord, skal den skrive fejl.
Okay, forklar mig præcis hvordan din TXT ser ud, og forklar mig hvordan du vil vælge hvad den skal sortere på... Skal det være ved manuel indtastning ?
Altså kan jo lave det sådan at den popper op og siger: Indtast det ord du vil finde. Så skriver du ordet, og den søger dokumentet igennem for ordet, og skriver linien hvis den indeholder ordet... er det sådan du mener ?.... Du må altså prøve at specificere det lidt bedre.
Det er hvad der på nuværende tidspunkt står, og så planen med det er:
Hvis jeg har en string, hvor der er et ord som indholder det som der står i ord.txt skal den komme med en fejl. - og hvis den ikke indholder nogle ord fra ord.txt skal der selvfølgelig ikke ske noget.
string test = "Hej Tosse, har du det godt";
Så skal den komme med fejl, og fortælle hvilket ord som er "forbudt" i dette tilfælde Tosse.
string test2 = "Hej Tosse, du er en Bandit";
Her skal den så fortælle at Tosse og Bandit ikke er tilladt.
string test3 = "Hej du, har du det godt";
Her er der ingen fejl, og scriptet kører videre som det skal.
//Læs evt. ind fra en fil.. string[] cencuredWords = {"tosse", "nar"};
string line = "Hej med dig din nar!"; bool val = line.Split().Any(s => cencuredWords.Contains(s)); if (val) { Console.WriteLine("linjen indeholder et forbudt ord."); }
//Find ordet. string forbiddenWord = (from s in cencuredWords where line.Split().Contains(s) select s).FirstOrDefault(); if (forbiddenWord != null) { Console.WriteLine("line indeholder {0}.", forbiddenWord); }
Men kan se at Bvli er kommet med en løsning på det.
Det du søger er en kode der dynamisk kan udvide sig uden at skulle pille i koden, men blot i en txt fil.
Så helt har bvli ikke løst det...
Du skal bare lave et streng array som du smider dataen ind i fra din txt reader, så hver linie i din .txt fil bliver smidt ind i arayet, og så bruge bvli's kode. så du skal nok lige have en txt reader.
DOG! eftersom det er censur det lader til du har gang i er det garanteret til en hjemmeside i asp ?...
Så vil jeg foreslå dig at lave det statisk i koden, så du har ordene der inde. som Bvli har skrevet...
IEnumerable<string> forbiddenWords = from s in cencuredWords where line.Split().Contains(s) select s; string w = string.Join(",", forbiddenWords); if (w.Length > 0) { Console.WriteLine("line indeholder forbudte ord! -> {0}.", w); }
I øvrigt vil jeg mene, at du for performancens skyld bør kigge på regular expressions.
j3ppah> Jeg har søgt lidt rundt, men fandt ikke noget jeg kunne bruge. Men problemet er bare, at jeg altid har arbejdet med INI og MySQL. Så jeg har ALDRIG været forbi txt. Derfor har jeg aldrig brugt sådan noget kode før. :o) Grunden til dette skulle være txt, er fordi det hurtigt skal rettes til hele tiden.
bvli> Jeg siger tak for din kode, men det eneste der mangler, det er hvis der f.eks. er ! eller andet foran eller bag ordet. Så fanger den det ikke, men jeg ved jeg skal bruge noget .Replace("!", ""); men hvor skal denne placeres?
IEnumerable<string> forbiddenWords = from s in cencuredWords where line.Split().IndexOf(s) > -1 select s; string w = string.Join(",", forbiddenWords); if (w.Length > 0) { Console.WriteLine("line indeholder forbudte ord! -> {0}.", w); }
.. hvis du vil ud over udråbstegnsproblematikken. Men jeg vil endnu engang påpege at kald til Split() osv. er døden rent performancemæssigt.
Jeg mener også helt klart du bør undgå for meget alm. streng operationer, jeg vil klart anbefale IList som jeg tidligere trak frem, og her har jeg ændret den så den passer bedre til dit eksempel.
string tekst = "Hej Tosse"; List<string> bannedLines = new List<string>(); bannedLines.AddRange(File.ReadAllLines(@"C:\Banned.txt")); // Denne giver en liste over alle de ord der er fundet som ikke er gyldige List<string> bannedFound = bannedLines.FindAll(b => tekst.Contains(b));
Nu bliver der flere gange nævnt ordet performance.
I den anledning vil jeg lige bemærke at:
1) performance af Split er mindre vigtig, hvis man kun kalder den en gang og genbruger output til mange test
2) alle løsninger med List<> eller array er O(n) for at checke et enkelt ord, mens en løsning med Dictionary<> er O(1)
Synes godt om
Ny brugerNybegynder
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.