webForumDet fria alternativet

Textfiler datamining

6 svar · 511 visningar · startad av rincewind

rincewindMedlem sedan nov. 2003104 inlägg
#1

Hej,

Min chef vill att jag ska plocka ur data ur c:a 1000 st gammla text filer. Och jag gillar PHP sådärför har jag gjort lite däri.=)

Datat som ska plockas ut är datum och påbörjas med (exempelvis:)
Faktura datum: ... 13 oktober, 1996

Och jag har lyckats läsa in text filer i en fin loop och spara undan dem i en sträng, men jag undrar om det finns någe bra sätt att leta efter alla dessa ställen och parsa ut just datumen som börjar med denna sträng så jag kan parsa om dem till en timestamp med strtotime och sedan spara undan dem på ett mer elegant sätt?=)...

Någon som vet hur man får fram just den informationen?

Mvh
-- Rincewind..

metalboyMedlem sedan jan. 2005953 inlägg
#2

Använd preg_match_all()

rincewindMedlem sedan nov. 2003104 inlägg
#3

Jo, jag hittade den nyss också, men hur skriver jag preggen?

metalboyMedlem sedan jan. 2005953 inlägg
#4

Eftersom du har skrivit ... mellan "Faktura datum:" och "13 oktober, 1996" så antar jag att det finns någon text där som du inte är intresserad av. Är det korrekt?

preg_match_all('/Faktura datum: .*? (\d{1,2} .*?, \d{4})/is', $text, $matches);
echo '<pre>', print_r($matches, 1), '</pre>';
rincewindMedlem sedan nov. 2003104 inlägg
#5

hohoho.. Tack.. läckert!!

En fråga dock...

'/Faktura datum: .*? (\d{1,2} .*?, \d{4})/is'

Vad gör \d och .*?
och /is

=) Försöker lära mig lite=)

metalboyMedlem sedan jan. 2005953 inlägg
#6

. matchar vilket tecken som helst (nästan iaf :))
* matchar tecknet innan 0 gånger eller fler
? matchar tecknet innan 0 eller 1 gång

.*? betyder matcha vilket tecken som helst 0 gånger eller fler, men ta så lite som möjligt... typ. Visar med ett exempel:

$text = 'Lite text. <b>Fet text</b>. <i>Kursiv text</i>. <b>Mer fet text</b>';
preg_match_all('/<b>(.*?)<\/b>/', $text, $matches1);
preg_match_all('/<b>(.*)<\/b>/', $text, $matches2);

echo '<pre>$matches1 = ', print_r($matches1, 1), '
$matches2 = ', print_r($matches2, 1), '</pre>';

Hoppas att du med det exemplet ser skillnaden mellan .* och .*?

\d matchar en siffra (0-9)
/i betyder Case Insensitive
/s gör så att . även matchar radbrytningar

rincewindMedlem sedan nov. 2003104 inlägg
#7

Wow.. Tack metalboy för det mest suveräna svaret jag sett på länge... Tackar..

Du har inte lust att hjälpa mig med en till preg? Om man ska hitta en email adress i en stor text massa... OCH att den rad som emailadressen finns på även ska innehålla ett annat ord?
Exempel:
Kontakt:... email@domain.com

Kämpat med det en stund, men totalt misslyckats ..=(

133 ms totalt · 3 externa anrop · v20260731065814-full.b943c234
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)