Avatar billede GoofyDK Nybegynder
16. november 2010 - 12:05 Der 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)

Mvh,
Dennis.
Avatar billede bkp Nybegynder
16. november 2010 - 12:22 #1
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?
Avatar billede GoofyDK Nybegynder
16. november 2010 - 12:22 #2
Det er begge dele, jeg kan godt selv finde ud af at skrive til en txt fil.
Avatar billede bkp Nybegynder
16. november 2010 - 12:25 #3
Følgende kode vil returnere true hvis Tosse er i strengen.
("Hej Tosse, du ser godt ud.").Contains("Tosse");
Avatar billede GoofyDK Nybegynder
16. november 2010 - 12:26 #4
Ja, men der står tekst i en .txt fil. Det er derfra den skal læse.
Avatar billede bkp Nybegynder
16. november 2010 - 12:30 #5
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.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 12:39 #6
Hm, ja. Men det hjalp mig bare ikke rigtigt hen til det jeg ville. :)

Jeg vil gerne have, at den læser fra en tekst fil (.txt). Ud fra den, står der så nogle ord. Hvis de ord findes i en string, så skal den give fejl.

Jeg kan jo ikke lave en line.Contains() ved hvert ord, som er i tekst filen. Der må være en nemmere løsning :)
Avatar billede j3ppah Novice
16. november 2010 - 12:45 #7
Tror det er noget lignende det her du søger... du kan lige sige hvis den skal håndtere det på en anden måde.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = Directory.GetCurrentDirectory();
            Console.WriteLine("Current directory = "+ path);
            ForEach(path);
        }

        static void ForEach(string path)
        {
            string ex = "";
            StringBuilder sb = new StringBuilder();
            foreach (string file in Directory.GetFiles(path))
            {
                FileInfo fi = new FileInfo(file);
                string[] lines = File.ReadAllLines(file);

                foreach (string strline in lines)
                {
                    if (strline.Contains("Tosse"))
                    {
                        if (ex.Contains(strline))
                        {

                        }
                        else
                        {
                            ex = ex + " " + strline;
                            Console.WriteLine(strline);
                        }
                    }

                }
            }
            Console.ReadLine();
        }
    }
}
Avatar billede j3ppah Novice
16. november 2010 - 12:45 #8
Ps. opret en ny mappe. lig exefilen der i, smid din txt fil i samme mappe. og kør exe filen.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 12:48 #9
Hej j3ppah

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.

Håber du forstår mig bedre nu.
Avatar billede j3ppah Novice
16. november 2010 - 12:52 #10
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.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 13:01 #11
Jeg prøver at skrive lidt dybere.

I min tekst fil (ord.txt) står der:

Tosse
Bandit
Ostereje

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.
Avatar billede bvli Praktikant
16. november 2010 - 13:17 #12
//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);
}
Avatar billede j3ppah Novice
16. november 2010 - 13:25 #13
Ahhh, så er jeg med...

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...
Avatar billede GoofyDK Nybegynder
16. november 2010 - 13:25 #14
Bvli, umiddelbart kommer der ikke noget frem i min console, fra den kode af.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 13:27 #15
Det er ikke til nogen hjemmeside j3ppah.
Men jeg er stadig lidt forvidret, hehe.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 13:29 #16
Bvli, jo jeg skulle bare fjerne ! fra nar. Men hvordan får jeg det til at virke med ! f.eks.?
Avatar billede GoofyDK Nybegynder
16. november 2010 - 13:33 #17
Og hvis evt. der er flere ord som indholder det ordne, så skriver den kun det ene ord fra cencuredWords.
Avatar billede j3ppah Novice
16. november 2010 - 13:40 #18
Nu er det her hverken for at virke provokerende eller noget, men kunne måske foreslå dig at kigge på lidt basis c# kode :)...
Avatar billede bvli Praktikant
16. november 2010 - 13:44 #19
Altså nu var det til ren inspiration.

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.
Avatar billede GoofyDK Nybegynder
16. november 2010 - 13:54 #20
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?
Avatar billede GoofyDK Nybegynder
16. november 2010 - 14:02 #21
Nevermind, jeg har fundet løsningen på det. Tak for det alle sammen, vil i være søde og komme med svar som skal have point. :)
Avatar billede j3ppah Novice
16. november 2010 - 14:10 #22
du skal jo lige sige hvilken løsning du har brugt, for at vi ved hvem der skal have points ;)...
Avatar billede GoofyDK Nybegynder
16. november 2010 - 14:13 #23
Jeg har brugt bvli, men I har jo alle hjulpet. :o)
Avatar billede j3ppah Novice
16. november 2010 - 14:20 #24
smid du blot et svar bvli :)
Avatar billede bvli Praktikant
16. november 2010 - 14:53 #25
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.
Avatar billede j3ppah Novice
16. november 2010 - 14:57 #26
... vil også foreslå dig at bruge .contrains i stedet, og helt hopper over split...
Avatar billede bkp Nybegynder
16. november 2010 - 16:12 #27
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));
Avatar billede arne_v Ekspert
28. december 2010 - 02:17 #28
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)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester