Just nu i M3-nätverket
Gå till innehåll

Söka och skriva i textfiler - StreamWriter


Micke_skane

Rekommendera Poster

Hej,

 

Har en sak jag vill göra för att lära mig mer(samt lösa en sak jag vill göra) men kan inte få till koden.

 

Det ska finnas följande:

 

2 st textrutor

1 st knapp

 

Vid aktivering med knappen ska man söka i en textfil(befintlig) efter exakt den textsträngen man skrivit in i textruta 2.

Hittar man en matchning(textraden som matchningen hittades i) ska en textfil(.txt) skapas med filnamnet som skrivs in i textruta 1.

Varje matchning(hela textraden som matchningen ingick i) ska skrivas in i den nya textfilen som skapades.

Därefter ska varje textfil som skapats(och redan ligger i mappen) listas upp på sidan med textrutorna/knappen.

 

T ex:

 

Befintlig textfil:

http://www.1.se;okänt;Porsche;911

http://www.2.se;okänt;Porsche;959

http://www.3.se;okänt;Volvo;S60

I textruta 1 skriver man porsche.

I textruta 2 skriver man Porsche; och då hittas den matchningen i rad 1 och 2 och dem raderna/meningarna ska skrivas i en nya textfil som då ska heta porsche.txt.

 

Viktigt att sökningen skiljer på gemener och VERSALER.

 

Jag har förstått att jag kan använda WriteLine(obj,ReadLine()) och enbart WriteLine(matchningen/textraden)

men hur sökningen ska se ut och få allt(koden) på ett stabilt/enkelt sätt har jag inte grepp på.

 

Några kodförslag med StreamWriter(C#) tas gärna emot ;)

Länk till kommentar
Dela på andra webbplatser

Jag vet inte om jag förstod dig rätt. Men något sånt här kanske?

using(var reader = File.OpenText("befintlig.txt"))
{
string line = "";
while((line = reader.ReadLine()) != null)
{
	if(line == textruta2.Text)
	{
		// text hittades. Skapa fil här.
		using (var writer = new StreamWriter(File.Open(textruta1.Text, FileMode.OpenOrCreate)))
           		{
               		writer.WriteLine(textruta2.Text);
               		break;
           		}
	}
}
}
}

 

Och en detalj. När du säger att det är viktigt att sökningen skiljer på gemener och versaler så bör du veta att det inte går hursomhelst med filnamn i Windows. För Windows skiljer inte på gemener och versaler bland filnamn.

Länk till kommentar
Dela på andra webbplatser

Förlåt en okunnig, men handlar detta om C#, som nämns i texten, eller om ASP.NET, som är avdelningen det ligger i?

Om det ligger fel så flyttar jag gärna tråden.

 

Cecilia

Moderator

Länk till kommentar
Dela på andra webbplatser

Både och. ASP.NET är ett sätt att skriva websiter i .NET och man använder gärna C# eller VB.NET. Koden är rätt lik program som går på windows. Med undantag för html och css naturligtvis.

 

Men om det är fokus på hur själva programkoden för sökning fungerar så bör det flyttas till C#.

Länk till kommentar
Dela på andra webbplatser

Jag vet inte om jag förstod dig rätt. Men något sånt här kanske?

Nja, tror inte det riktigt!

Ditt förslag skrivs väl det värde som stod i textruta 2 in som en nya rad i den nya textfilen.

Jag menar att om jag skriver in Porsche i textruta 2 så vill jag leta i varje rad i den befintliga textfilen om det förekommer.

I t ex första raden i mitt exempel http://www.1.se;okänt;Porsche;911 förekommer det och då vill jag att Hela raden, http://www.1.se;okänt;Porsche;911'>http://www.1.se;okänt;Porsche;911, ska skrivas in i den nya filen som en nya rad.

 

Typ i "kodväg":

Om Porsche finns i textraden http://www.1.se;okänt;Porsche;911 skriv textraden i den nya textfilen.

 

I javascript kan man ju använda sting.match(regexp) för att se om det blir en träff på söksträngen(ordet) i en text(rad).

Blir det !=null är där en träff och lägg då in Hela raden som man sökt i in i den nyatextfilen.

Länk till kommentar
Dela på andra webbplatser

Jag tror jag förstått dig rätt och då ska detta fungera. Parametrarna borde vara självförklarande.

 

EDIT: Glöm inte lägga till följande referenser

using System.IO;
using System.Text.RegularExpressions;

 

 

        private void CreateMatchFile(string sourceFile, string destFile, string keyWord)
       {
           try
           {
               StreamReader sr = new StreamReader(sourceFile);
               StreamWriter sw = new StreamWriter(destFile, false);
               string source = sr.ReadToEnd();

               Regex re = new Regex(@"^(.*" + keyWord + ".*)$", RegexOptions.Multiline);
               foreach (Match matchedLine in re.Matches(source))
               {
                   sw.WriteLine(matchedLine.Value);
               }
               sr.Close();
               sr.Dispose();
               sw.Close();
               sw.Dispose();
           }
           catch (Exception ex)
           {
               throw new Exception("Något gick fel:" + ex.Message);
           }
       }

Länk till kommentar
Dela på andra webbplatser

Det där ser ut att göra vad jag är ute efter, har dock inte testat det ännu...

En liten uppdelning för att se om jag förstått "delarna" i koden:

 

StreamReader sr = new StreamReader(sourceFile);

Skapas objekt för grundfilen som jag ska läsa ur.

 

StreamWriter sw = new StreamWriter(destFile, false);

Skapa objekt för filen som ska skapas med raderna där sökordet ingår.

Sen om append ska vara false eller true får jag känna efter hur jag vill :)

 

string source = sr.ReadToEnd();

source innehåller hela textmassan som ska kontrolleras.

 

Regex re = new Regex(@"^(.*" + keyWord + ".*)$", RegexOptions.Multiline);

Tja, vad ska man säga... :)...lite latinlära... ;)

Den där MultiLine förstod jag inte helt ang start- och stopppunkterna...

 

foreach (Match matchedLine in re.Matches(source))

För varje textrad som är en "träff" där sökordet ingår i...

{

sw.WriteLine(matchedLine.Value);

...skriv in textraden i den nya textfilen.

}

sr.Close();

sr.Dispose();

sw.Close();

sw.Dispose();

Stäng och frigör objekten(och lite till..)

Länk till kommentar
Dela på andra webbplatser

Du har förstått allt rätt.

 

Angående

"Tja, vad ska man säga... ...lite latinlära...

Den där MultiLine förstod jag inte helt ang start- och stopppunkterna..."

Om man anger Multiline så ändras betydelsen av ^ och $. Normalt skulle de ange start och slut för hela textmassan, men nu anger de start och slut på varje rad. Detta gör att man slipper krångla med regex-uttrycket för att matcha olika typer av radbrytningar.

Länk till kommentar
Dela på andra webbplatser

Du har förstått allt rätt.

Va bra, då är det helt enligt mina tankar jag hade om det :)

 

...men nu anger de start och slut på varje rad. Detta gör att man slipper krångla med regex-uttrycket för att matcha olika typer av radbrytningar.

Ok, då förstår jag skillnaden med start- och slutpunkterna.

 

Stort tack för vägledningen!

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...