c# - Spara all text mellan specifika ord

Permalänk
Medlem

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#

Visa signatur

Professionell amatör

Permalänk

@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?

Visa signatur

AMD Ryzen 5 3600 | Sapphire R9 280

Permalänk
Medlem

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

Visa signatur

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

Permalänk
Medlem
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!

Visa signatur

Professionell amatör

Permalänk
Medlem
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

Visa signatur

Professionell amatör

Permalänk

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.

Visa signatur

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 *

Permalänk
Medlem
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.

Visa signatur

Professionell amatör

Permalänk
Medlem

@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å

Permalänk
Medlem
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[]

Visa signatur

Professionell amatör

Permalänk
Medlem
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(); } }

Visa signatur

Professionell amatör

Permalänk
Medlem
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.

Permalänk
Legendarisk

@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
Visa signatur

Abstractions all the way down.

Permalänk
Medlem
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

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
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 !

Visa signatur

Professionell amatör

Permalänk
Medlem
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

Visa signatur

Professionell amatör

Permalänk
Legendarisk
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.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem
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

Visa signatur

Professionell amatör

Permalänk
Medlem
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

Visa signatur

Professionell amatör

Permalänk
Medlem
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

Visa signatur

Professionell amatör

Permalänk
Legendarisk
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".

Visa signatur

Abstractions all the way down.

Permalänk
Medlem
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.

Permalänk
Medlem
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!

Visa signatur

Professionell amatör