webForumDet fria alternativet

Textfiler datamining

PHPur PHP

6 svar · 511 visningar · startad av rincewind

Medlem sedan nov. 2003104 inlägg
Frågan#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..

Medlem sedan jan. 2005953 inlägg
#2

Använd preg_match_all()

Medlem sedan nov. 2003104 inlägg
#3

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

Medlem 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>';
Medlem 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=)

Medlem 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

Medlem 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 ..=(

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