c# - Spara all text mellan specifika ord

Trädvy Permalänk
Medlem
Registrerad
Nov 2014

c# - Spara all text mellan specifika ord

Tjenare, skulle behöva lite hjälp med mitt pågående "projekt". Om jag t.ex har texten:

"News & Events", "title": "hejsan sweclockers .", "created_utc", "Hot", "title": "vill inte ha med", "created utc", "News & Events", "title": "hejdå sweclockers .", "created_utc"

Och jag skulle vilja få ut texten:
hejsan sweclockers
hejdå sweclockers

Hur bär jag mig åt? Vill bara ha titles som ligger någonstans mellan "News & Events" och "created_utc", lyckas bara få ut den första titeln, men aldrig den andra! Ursäkta för min fruktansvärda förklarning. Men kanske finns någon som begriper vad jag är ute efter. Tack!

Språket jag använder är alltså C#

Professionell amatör

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Nov 2013

@pontusv:

Har du en String som är ""News & Events", "title": "hejsan sweclockers .", "created_utc", "News & Events", "title": "hejdå sweclockers .", "created_utc"" eller har du en array av alla fraser inom citattecken?

AMD FX-8350|Sapphire R9 280|Obsidian 800D|Argon AR01

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2002

Regex låter smidigast för detta. Har dock inte möjlighet att ge kodexempel då jag sitter på mobilen.

https://msdn.microsoft.com/en-us/library/vstudio/system.text....

Skickades från m.sweclockers.com

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av utsatt_unge496:

@pontusv:

Har du en String som är ""News & Events", "title": "hejsan sweclockers .", "created_utc", "News & Events", "title": "hejdå sweclockers .", "created_utc"" eller har du en array av alla fraser inom citattecken?

Texten är en string!

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av RiJo:

Regex låter smidigast för detta. Har dock inte möjlighet att ge kodexempel då jag sitter på mobilen.

https://msdn.microsoft.com/en-us/library/vstudio/system.text....

Skickades från m.sweclockers.com

Tack! ska ta en titt, haft lite svårt att förstå regex men ger det ett försök

Professionell amatör

Trädvy Permalänk
Medlem
Plats
Ellös
Registrerad
Jan 2008

Kan ju använda substring.. Eller regex eller spara allt i en array och bara välja vilka element du vill skriva ut.

Edit: Sitter på mobilen så krångligt att ge lite kod exempel. Kan kolla närmare på det när jag kommer hem.

P190 * Gigabyte X58-UD5 * i7 920 * Corsair 6Gb 1333Mhz CL-9 * GTX 560 Ti SLI * Velociraptor 150GB * Seagate 500GB 7200.11 * Plextor PX-810SA * Vista 64 * T220 *

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Meller127:

Kan ju använda substring.. Eller regex eller spara allt i en array och bara välja vilka element du vill skriva ut.

Edit: Sitter på mobilen så krångligt att ge lite kod exempel. Kan kolla närmare på det när jag kommer hem.

Kommer lägga till lite text i min beskrivning då jag var lite flummig. I den långa stringen jag har så finns det massor av saker som jag inte vill ha med, t.ex ser min text ut såhär:

"News & Events", "title": "hejsan sweclockers .", "created_utc", "Hot", "title": "vill inte ha med", "created utc", "News & Events", "title": "hejdå sweclockers .", "created_utc"

jag vill alltså bara ha med alla titles som har "News & Events" en bit före (behöver inte ligga just före title, utan kan ligga lite text mellan. Men principen är densamma.

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Aug 2013

@pontusv:
Ser ut som att du borde kunna använda String.Split() för att göra en string array av din input. Därifrån bör du får det lättare att processa det hela. Du behöver hitta någon bra avgränsare bara. Vet inte vilka teckensammansättningar som kan förekomma i din input, men det ser väl ut som att du skulle kunna ha ", " som avgränsare. Då skulle du alltså få en string array ungefär så här:

[0]: News & Events
[1]: title": "hejsan sweclockers .
[2]: created_utc
[3]: Hot
[4]: title": "vill inte ha med
[...]

Det mest primitiva lösningen efter det vore ju att sedan iterera genom arrayen och hitta par av element enligt din beskrivning för att kunna extrahera titlarna av intresse. Att använda RegEx skulle förmodligen ge den elegantaste lösningen, men då måste man vara lagd åt det hållet rent tankemässigt också

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Sebbepojken:

@pontusv:
Ser ut som att du borde kunna använda String.Split() för att göra en string array av din input. Därifrån bör du får det lättare att processa det hela. Du behöver hitta någon bra avgränsare bara. Vet inte vilka teckensammansättningar som kan förekomma i din input, men det ser väl ut som att du skulle kunna ha ", " som avgränsare. Då skulle du alltså få en string array ungefär så här:

[0]: News & Events
[1]: title": "hejsan sweclockers .
[2]: created_utc
[3]: Hot
[4]: title": "vill inte ha med
[...]

Det mest primitiva lösningen efter det vore ju att sedan iterera genom arrayen och hitta par av element enligt din beskrivning för att kunna extrahera titlarna av intresse. Att använda RegEx skulle förmodligen ge den elegantaste lösningen, men då måste man vara lagd åt det hållet rent tankemässigt också

Min string som innehåller all text heter "webData", testade split-funktionen: string[] s = (webData.Split(','));
Men jag får output: System.String[]

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Sebbepojken:

@pontusv:
Ser ut som att du borde kunna använda String.Split() för att göra en string array av din input. Därifrån bör du får det lättare att processa det hela. Du behöver hitta någon bra avgränsare bara. Vet inte vilka teckensammansättningar som kan förekomma i din input, men det ser väl ut som att du skulle kunna ha ", " som avgränsare. Då skulle du alltså få en string array ungefär så här:

[0]: News & Events
[1]: title": "hejsan sweclockers .
[2]: created_utc
[3]: Hot
[4]: title": "vill inte ha med
[...]

Det mest primitiva lösningen efter det vore ju att sedan iterera genom arrayen och hitta par av element enligt din beskrivning för att kunna extrahera titlarna av intresse. Att använda RegEx skulle förmodligen ge den elegantaste lösningen, men då måste man vara lagd åt det hållet rent tankemässigt också

Här är den större delen av koden, resten är oviktig! skulle gärna vilja veta varför jag får problemet med .split :S

static void Main(string[] args) { System.Net.WebClient wc = new System.Net.WebClient(); byte[] raw = wc.DownloadData("https://www.reddit.com/r/GlobalOffensive/top/.json?limit=100"); string webData = System.Text.Encoding.UTF8.GetString(raw); Console.WriteLine(webData); if (webData.Length > 100) { using (new OutToFile("output.txt")) // redirect the output to a text file { Console.WriteLine(webData); } Console.ReadKey(); //string[] s = (webData.Split(',')); int titleNumber = 1; string title = titleNumber + ".txt"; using (new OutToFile(title)) // redirect the output to a text file { Console.WriteLine(s); } Console.Clear(); Console.WriteLine(s); Console.ReadKey(); } }

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Aug 2013
Skrivet av pontusv:

skulle gärna vilja veta varför jag får problemet med .split :S

Vilket är problemet? Jag ser bara att du har kommenterat bort den raden. Menar du att du får något kompileringsfel?

Edit: Om det nu är json-data som gäller så finns det ju betydligt enklare sätt att angripa problemet. Json.Net verkar vara populärt att använda ser jag efter en snabb googling. Se här exempelvis: http://stackoverflow.com/questions/12676746/parse-json-string-in-c-sharp. Då får du färdiga objekt du kan arbeta med istället för att ha string-arrayer.

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002

@pontusv: Eftersom att det rör sig om JSON så bör du använda något som faktiskt förstår formatet istället för att bara behandla det som ostrukturerad text, även om du får det att fungera med reguljära uttryck nu så finns det ingen garanti för att förändringar i innehållet inte ger dig felaktiga resultat senare.

För att göra det med verktyg som finns inkluderade i .NET så kan du t.ex. använda dig av DataContractJsonSerializer. Den här artikeln har en del information om hur du kommer igång med det: How to: Serialize and Deserialize JSON Data.

using System; using System.Collections.Generic; using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; namespace Example { class Program { static void Main(string[] args) { var httpRequest = WebRequest.CreateHttp("https://www.reddit.com/r/GlobalOffensive/top/.json?limit=100"); var httpResponse = httpRequest.GetResponse(); var serializer = new DataContractJsonSerializer(typeof(ApiResult)); var result = serializer.ReadObject(httpResponse.GetResponseStream()) as ApiResult; foreach(var child in result.Data.Children) { Console.WriteLine(child.Data.LinkFlairText + ": " + child.Data.Title); } Console.ReadKey(); } } [DataContract] class ApiResult { [DataMember(Name = "data")] public T2 Data; } [DataContract] class T2 { [DataMember(Name = "children")] public List<T2Item> Children; } [DataContract] class T2Item { [DataMember(Name = "data")] public T3 Data; } [DataContract] class T3 { [DataMember(Name = "link_flair_text")] public string LinkFlairText; [DataMember(Name = "title")] public string Title; } }

Snabbt exempel

Abstractions all the way down.

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007
Skrivet av pontusv:

Kommer lägga till lite text i min beskrivning då jag var lite flummig. I den långa stringen jag har så finns det massor av saker som jag inte vill ha med, t.ex ser min text ut såhär:

"News &amp; Events", "title": "hejsan sweclockers .", "created_utc", "Hot", "title": "vill inte ha med", "created utc", "News &amp; Events", "title": "hejdå sweclockers .", "created_utc"

jag vill alltså bara ha med alla titles som har "News &amp; Events" en bit före (behöver inte ligga just före title, utan kan ligga lite text mellan. Men principen är densamma.

  1. splitta på '"News &amp; Events"' för att få grupper

  2. Hitta position av första '"title"' i varje grupp

  3. Hitta första positionen av ',' efter '"title"' i varje grupp

  4. Splitta på ':', ta del 2, trimma bort eventuellt whitespace

Eller i javascript:

function findTitlesIn(text) { return text .split('"News &amp; Events"') .map(function (chunk) { return { chunk: chunk, titlePos: chunk.indexOf('"title"') } }) .filter(function (context) { return context.titlePos !== -1 }) .map(function (context) { var commaPos = context.chunk.indexOf(',', context.titlePos) var titleValuePair = context.chunk.substring(context.titlePos, commaPos) return titleValuePair.split(':')[1].trim() }) } findTitlesIn('"News &amp; Events", "title": "hejsan sweclockers .", "created_utc", "Hot", "title": "vill inte ha med", "created utc", "News &amp; Events", "title": "hejdå sweclockers .", "created_utc"') // > [""hejsan sweclockers ."", ""hejdå sweclockers .""]

Att översätta ovanstående till C# får bli en egen övning. Rör det sig om JSON kan du använda http://www.newtonsoft.com/json

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Sebbepojken:

Vilket är problemet? Jag ser bara att du har kommenterat bort den raden. Menar du att du får något kompileringsfel?

Edit: Om det nu är json-data som gäller så finns det ju betydligt enklare sätt att angripa problemet. Json.Net verkar vara populärt att använda ser jag efter en snabb googling. Se här exempelvis: http://stackoverflow.com/questions/12676746/parse-json-string-in-c-sharp. Då får du färdiga objekt du kan arbeta med istället för att ha string-arrayer.

Varför jag kommenterade bort den var för att den raden gav mig bara "System.String[]" som output! Tack för länken, ska genast kolla !

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Tunnelsork:

@pontusv: Eftersom att det rör sig om JSON så bör du använda något som faktiskt förstår formatet istället för att bara behandla det som ostrukturerad text, även om du får det att fungera med reguljära uttryck nu så finns det ingen garanti för att förändringar i innehållet inte ger dig felaktiga resultat senare.

För att göra det med verktyg som finns inkluderade i .NET så kan du t.ex. använda dig av DataContractJsonSerializer. Den här artikeln har en del information om hur du kommer igång med det: How to: Serialize and Deserialize JSON Data.

using System; using System.Collections.Generic; using System.Net; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; namespace Example { class Program { static void Main(string[] args) { var httpRequest = WebRequest.CreateHttp("https://www.reddit.com/r/GlobalOffensive/top/.json?limit=100"); var httpResponse = httpRequest.GetResponse(); var serializer = new DataContractJsonSerializer(typeof(ApiResult)); var result = serializer.ReadObject(httpResponse.GetResponseStream()) as ApiResult; foreach(var child in result.Data.Children) { Console.WriteLine(child.Data.LinkFlairText + ": " + child.Data.Title); } Console.ReadKey(); } } [DataContract] class ApiResult { [DataMember(Name = "data")] public T2 Data; } [DataContract] class T2 { [DataMember(Name = "children")] public List<T2Item> Children; } [DataContract] class T2Item { [DataMember(Name = "data")] public T3 Data; } [DataContract] class T3 { [DataMember(Name = "link_flair_text")] public string LinkFlairText; [DataMember(Name = "title")] public string Title; } }

Snabbt exempel

Tack så hemskt mycket, varit lite förvirrad med vad jag ska leta efter. Är som sagt nybörjare på det här, men det ska inte vara ett hinder för att lära sig ! (Y) Återkommer med resultat senare

Professionell amatör

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002
Skrivet av pontusv:

Tack så hemskt mycket, varit lite förvirrad med vad jag ska leta efter. Är som sagt nybörjare på det här, men det ska inte vara ett hinder för att lära sig ! (Y) Återkommer med resultat senare

Exemplet är färdigt att köra, men du kan behöva lägga till en referens till System.Runtime.Serialization. Använder du Visual Studio så öppna menyn Project -> Add reference och välj den i listan där, alternativt så kan du nå samma dialogruta via Solution Explorer.

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Tunnelsork:

Exemplet är färdigt att köra, men du kan behöva lägga till en referens till System.Runtime.Serialization. Använder du Visual Studio så öppna menyn Project -> Add reference och välj den i listan där, alternativt så kan du nå samma dialogruta via Solution Explorer.

Får tusentals fel då jag försöker köra igång det, den klagar på "using System.Runtime.Serialization.Json;" och alla "datamember, datacontract osv." la till referens som du sa

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Tunnelsork:

Exemplet är färdigt att köra, men du kan behöva lägga till en referens till System.Runtime.Serialization. Använder du Visual Studio så öppna menyn Project -> Add reference och välj den i listan där, alternativt så kan du nå samma dialogruta via Solution Explorer.

Grymt fick nu igång det, så dum som man är så hade jag inte installerat json.net, men nu fungerade det precis som jag ville ha det, ska försöka läsa igenom koden så jag förstår ett och annat nu! Tack så hemskt mycket

Professionell amatör

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Tunnelsork:

Exemplet är färdigt att köra, men du kan behöva lägga till en referens till System.Runtime.Serialization. Använder du Visual Studio så öppna menyn Project -> Add reference och välj den i listan där, alternativt så kan du nå samma dialogruta via Solution Explorer.

Var nog lite snabb med firandet *edit* Av någon anledning så tar den med alla möjliga titlar istället för att bara ta med titlarna som ligger just efter News &amp; Events

Professionell amatör

Trädvy Permalänk
Webbutvecklare
Moderator
Plats
::1
Registrerad
Dec 2002
Skrivet av pontusv:

Var nog lite snabb med firandet *edit* Av någon anledning så tar den med alla möjliga titlar istället för att bara ta med titlarna som ligger just efter News &amp; Events

Exemplet försöker inte filtrera något, det demonstrerar bara hur du kan läsa ut information ur svaret du får från Reddit. Du skulle kunna börja med att inte skriva ut de rader som inte har LinkFlairText satt till "News &amp; Events".

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Aug 2013
Skrivet av pontusv:

Varför jag kommenterade bort den var för att den raden gav mig bara "System.String[]" som output! Tack för länken, ska genast kolla !

Det är för att Console.WriteLine() inte automagiskt skriver ut en hel arrays innehåll, utan den skrev helt enkelt ut datatypen. För att skriva ut innehållet behöver du iterera genom elementen.

Trädvy Permalänk
Medlem
Registrerad
Nov 2014
Skrivet av Tunnelsork:

Exemplet försöker inte filtrera något, det demonstrerar bara hur du kan läsa ut information ur svaret du får från Reddit. Du skulle kunna börja med att inte skriva ut de rader som inte har LinkFlairText satt till "News &amp; Events".

Jo jag la till filter för News & events, fungerar bra nu! Tack åter igen!

Professionell amatör