Fette Dateien richtig einlesen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Fette Dateien richtig einlesen

29 Apr 2021, 08:35

Hallo, ich hänge immer noch in meiner IMDb Schleife fest, jetzt habe ich auf der Webseite von imdb
https://www.imdb.com/interfaces/ sieben richtig große Textdateien gefunden. Diese werden täglich aktualisiert zum Download angeboten.

Da schlägt mein Data Herz gleich etwas schneller.

Ich kann sie wegen ihrer Größe nur zeilenweise einlesen, was dank der guten AHK-Hilfe auf GitHub auch gut funktioniert

So ist eine der Dateien strukturiert:
;nconst primaryName birthYear deathYear primaryProfession knownForTitles
nm0000001 Fred Astaire 1899 1987 soundtrack,actor,miscellaneous tt0053137,tt0050419,tt0031983,tt0072308
nm0000002 Lauren Bacall 1924 2014 actress,soundtrack tt0037382,tt0038355,tt0117057,tt0071877
nm0000003 Brigitte Bardot 1934 \N actress,soundtrack,music_department tt0049189,tt0057345,tt0054452,tt0056404


Ich habe sie mit Excel importiert, bei etwas über einer Millionen Einträgen, hat Excel den Import mit einer Fehlermeldung beendet, und einen Hinweis gezeigt, wie ich den Rest importieren kann.

Nun zu meiner Frage, wie stelle ich es an, diese Dateien zu verwalten, ich dachte an splitten nach Name, in einzelne Files a bis z... aber habe noch keine Ahnung wie ich das später in einer Datenbank (arrays) durchsuchbar mache

Vielen Dank fürs lesen


Code: Select all

Loop, read, V:\__ahk projekte aktuell\DSVParser_run\name.basics.tsv\data.tsv
          , V:\__ahk projekte aktuell\DSVParser_run\name.basics.tsv\dataWrite.tsv
{
AIndex := A_Index
    Loop, parse, A_LoopReadLine, %A_Tab%
    {
        ToolTip %  "AIndex: " AIndex "`nFeldnummer " A_Index " ist`n`n" A_LoopField
    }
    if !InStr(A_LoopReadLine, "bruce lee") {
        FileAppend, %A_LoopReadLine%`n
        If (A_Index>100000)
        Break
}}




/*  ; https://www.autohotkey.com/boards/viewtopic.php?p=54496#p54496
; fehler
NameBasicsTSV := "V:\__ahk projekte aktuell\DSVParser_run\name.basics.tsv\data.tsv"
DateiObjekt := FileOpen(NameBasicsTSV, "r")
NameBasicsTSVDBVar := DateiObjekt.Read(50000)
DateiObjekt.CLose()
MsgBox, 0, Name Basics TSV, %NameBasicsTSVDBVar%

; ok
TitleRatingsTSV := "V:\__ahk projekte aktuell\DSVParser_run\title.ratings.tsv\data.tsv"
DateiObjekt := FileOpen(TitleRatingsTSV, "r")
TitleRatingsTSVDBVar := DateiObjekt.Read()
DateiObjekt.CLose()
MsgBox, 0, Title Ratings TSV, %TitleRatingsTSVDBVar%

; fehler
TitlePrincipalsTSV := "V:\__ahk projekte aktuell\DSVParser_run\title.principals.tsv\data.tsv"
DateiObjekt := FileOpen(TitlePrincipalsTSV, "r")
TitlePrincipalsTSVDBVar := DateiObjekt.Read(500)
DateiObjekt.CLose()
MsgBox, 0, Title Principals TSV, %TitlePrincipalsTSVDBVar%

; ok
TitleEpisodeTSV := "V:\__ahk projekte aktuell\DSVParser_run\title.episode.tsv\data.tsv"
DateiObjekt := FileOpen(TitleEpisodeTSV, "r")
TitleEpisodeTSVDBVar := DateiObjekt.Read()
DateiObjekt.CLose()
MsgBox, 0, Title Episode TSV, %TitleEpisodeTSVDBVar%

; ok
TitleCrewTSV := "V:\__ahk projekte aktuell\DSVParser_run\title.crew.tsv\data.tsv"
DateiObjekt := FileOpen(TitleCrewTSV, "r")
TitleCrewTSVDBVar := DateiObjekt.Read()
DateiObjekt.CLose()
MsgBox, 0, Title Crew TSV, %TitleCrewTSVDBVar%

; ok
TitleBasicsTSV := "V:\__ahk projekte aktuell\DSVParser_run\title.basics.tsv\data.tsv"
DateiObjekt := FileOpen(TitleBasicsTSV, "r")
TitleBasicsTSVDBVar := DateiObjekt.Read()
DateiObjekt.CLose()
MsgBox, 0, Title Basics TSV, %TitleBasicsTSVDBVar%

; fehler
TitleAkasTSV := "V:\__ahk projekte aktuell\DSVParser_run\title.akas.tsv\data.tsv"
DateiObjekt := FileOpen(TitleAkasTSV, "r")
TitleAkasTSVDBVar := DateiObjekt.Read(500)
DateiObjekt.CLose()
MsgBox, 0, Title Akas TSV, %TitleAkasTSVDBVar%
*/
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fette Dateien richtig einlesen

29 Apr 2021, 09:39

Moin!
effel wrote:... aber habe noch keine Ahnung wie ich das später in einer Datenbank (arrays) durchsuchbar mache ...
Das ist das Stichwort ja schon gefallen. Wenn es solche Datenmengen sind, braucht AHK für eine sequentielle Suche manchmal recht lange. Es könnte sich lohnen, wenn man das in Datenbanken wie z.B. SQLite. Dabei kann die Command Line Shell For SQLite (SQLite.exe) genutzt werden, um die kompletten Dateien in (mehr oder weniger) einem Rutsch in Datenbanken zu überführen. Es erfordert allerdings einige Einarbeitung, umso mehr je weniger Vorkenntnisse man hat.

Eine Alternative wäre vielleicht, die Dateien per Skript einzulesen, in AHK-Arrays zu überführen und schließlich als JSON auszugeben. Für die interaktiven Skripte könnten dann die 'fertigen' JSON-Dateien genutzt werden. Ob das bei Riesenarrays vernünftig funktioniert, weiß ich nicht.
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Fette Dateien richtig einlesen

29 Apr 2021, 12:48

just me wrote:
29 Apr 2021, 09:39
Eine Alternative wäre vielleicht, die Dateien per Skript einzulesen, in AHK-Arrays zu überführen und schließlich als JSON auszugeben. Für die interaktiven Skripte könnten dann die 'fertigen' JSON-Dateien genutzt werden
Hallo Just Me
Danke für deine Antwort

Ich habe zwar im Moment keine Vorstellung wie das aussehen würde, aber vom Verständnis her denke ich, das ich eine Array Lösung eher lernen kann.

Als ich hier meine ersten Array Fragen stellte, war der Vorgedanke... das man doch eigentlich eine MySql DB auch mit Arrays orchestrieren könnte. Jetzt erkenne ich, das diese Annahme wohl voll daneben lag :o
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Fette Dateien richtig einlesen

29 Apr 2021, 13:43

jetzt habe ich auf der Webseite von imdb
https://www.imdb.com/interfaces/ sieben richtig große Textdateien gefunden.
Wundert mich das du (https://datasets.imdbws.com) erst finden musstest - ich hatte bereits vor einem Monat in (d)einem Thread darauf verwiesen: https://www.autohotkey.com/boards/viewtopic.php?p=389124#p389124 :think:

@just me hat hier: https://www.autohotkey.com/boards/viewtopic.php?p=325250#p325250 eine Option zum Zerlegen von großen Dateien aufgezeigt.
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Fette Dateien richtig einlesen

29 Apr 2021, 14:24

Hallo Bobo, entschuldige, aber das habe ich tatsächlich überlesen und dabei sind da die wirklichen essentials vergraben

Alleine die oben genannte name.basics.tsv\dataWrite.tsv wäre schon ihr Geld Wert, alle Namen. die letzten oder erfolgreichsten vier Filme... dann Geburts und Sterbetag...

Als ich die Tabelle sah, war mir klar das ich sie irgendwie händeln muss

Die ersten genannten Datensätze enthielten Namen wie Fred Astaire... ich bin mehr die ältere Generation und habe seine Broadway Filme gesehen. Als ich meine erste Postleitzahlen Tabelle vor mir hatte, war die Freude nicht annähernd so...

Deine omdb() ist in fast jedem Script obligatorisch, weil ich mit keiner anderen hier genannten imdb Anfragen schneller eine Antwort erhalte

Danke dir!

Solltest du (oder du Leserin im Hintergrund) mit recherchieren und weitere wertvolle Infos haben, würde ich mich sehr freuen wenn es hier geteilt wird
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Fette Dateien richtig einlesen

29 Apr 2021, 22:36

;nconst primaryName birthYear deathYear primaryProfession knownForTitles
nm0000001 Fred Astaire 1899 1987 soundtrack,actor,miscellaneous tt0053137,tt0050419,tt0031983,tt0072308
nm0000002 Lauren Bacall 1924 2014 actress,soundtrack tt0037382,tt0038355,tt0117057,tt0071877
nm0000003 Brigitte Bardot 1934 \N actress,soundtrack,music_department tt0049189,tt0057345,tt0054452,tt0056404

Die Fred Astaire-Zeile ist abweichend angeordnet! Ist das die tatsächliche Ausgangslage??
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Fette Dateien richtig einlesen

29 Apr 2021, 22:41

so kamen die Daten an:

Code: Select all

nconst	primaryName	birthYear	deathYear	primaryProfession	knownForTitles
nm0000001	Fred Astaire	1899	1987	soundtrack,actor,miscellaneous	tt0053137,tt0050419,tt0031983,tt0072308
nm0000002	Lauren Bacall	1924	2014	actress,soundtrack	tt0037382,tt0038355,tt0117057,tt0071877
nm0000003	Brigitte Bardot	1934	\N	actress,soundtrack,music_department	tt0049189,tt0057345,tt0054452,tt0056404
nm0000004	John Belushi	1949	1982	actor,soundtrack,writer	tt0077975,tt0080455,tt0072562,tt0078723
nm0000005	Ingmar Bergman	1918	2007	writer,director,actor	tt0069467,tt0050976,tt0050986,tt0060827
nm0000006	Ingrid Bergman	1915	1982	actress,soundtrack,producer	tt0034583,tt0077711,tt0036855,tt0038109
nm0000007	Humphrey Bogart	1899	1957	actor,soundtrack,producer	tt0034583,tt0042593,tt0043265,tt0033870
nm0000008	Marlon Brando	1924	2004	actor,soundtrack,director	tt0047296,tt0068646,tt0070849,tt0078788
nm0000009	Richard Burton	1925	1984	actor,soundtrack,producer	tt0057877,tt0087803,tt0061184,tt0059749
nm0000010	James Cagney	1899	1986	actor,soundtrack,director	tt0035575,tt0042041,tt0029870,tt0031867
nm0000011	Gary Cooper	1901	1961	actor,soundtrack,producer	tt0034167,tt0044706,tt0035896,tt0027996
nm0000012	Bette Davis	1908	1989	actress,soundtrack,make_up_department	tt0042192,tt0035140,tt0031210,tt0056687
nm0000013	Doris Day	1922	2019	soundtrack,actress,producer	tt0049470,tt0048317,tt0045591,tt0053172
nm0000014	Olivia de Havilland	1916	2020	actress,soundtrack	tt0040806,tt0029843,tt0041452,tt0031381
nm0000015	James Dean	1931	1955	actor,miscellaneous	tt0048545,tt0044245,tt0048028,tt0049261
nm0000016	Georges Delerue	1925	1992	composer,soundtrack,music_department	tt0069946,tt0091763,tt0057345,tt0096320
nm0000017	Marlene Dietrich	1901	1992	soundtrack,actress,music_department	tt0051201,tt0052311,tt0021156,tt0055031
nm0000018	Kirk Douglas	1916	2020	actor,producer,soundtrack	tt0049456,tt0054331,tt0043338,tt0043465
nm0000019	Federico Fellini	1920	1993	writer,director,assistant_director	tt0050783,tt0071129,tt0053779,tt0056801
nm0000020	Henry Fonda	1905	1982	actor,producer,soundtrack	tt0032551,tt0051207,tt0082846,tt0050083
nm0000021	Joan Fontaine	1917	2013	actress,soundtrack,producer	tt0035751,tt0040536,tt0032976,tt0034248
nm0000022	Clark Gable	1901	1960	actor,soundtrack,producer	tt0026752,tt0023382,tt0025316,tt0031381
nm0000023	Judy Garland	1922	1969	soundtrack,actress	tt0032138,tt0047522,tt0055031,tt0037059
nm0000024	John Gielgud	1904	2000	actor,writer,director	tt0117631,tt0071877,tt0082031,tt0045943
nm0000025	Jerry Goldsmith	1929	2004	music_department,soundtrack,composer	tt0117731,tt0100802,tt0119488,tt0077269
nm0000026	Cary Grant	1904	1986	actor,soundtrack,producer	tt0034248,tt0053125,tt0048728,tt0056923
nm0000027	Alec Guinness	1914	2000	actor,soundtrack,writer	tt0041546,tt0050212,tt0051739,tt0076759
nm0000028	Rita Hayworth	1918	1987	actress,soundtrack,producer	tt0040525,tt0038559,tt0036723,tt0035103
nm0000029	Margaux Hemingway	1954	1996	actress,miscellaneous	tt0110138,tt0077800,tt0074802,tt0102122
nm0000030	Audrey Hepburn	1929	1993	actress,soundtrack	tt0058385,tt0056923,tt0054698,tt0046250
nm0000031	Katharine Hepburn	1907	2003	actress,soundtrack,writer	tt0063227,tt0082846,tt0043265,tt0032904
nm0000032	Charlton Heston	1923	2008	actor,director,writer	tt0063442,tt0049833,tt0070723,tt0052618
nm0000033	Alfred Hitchcock	1899	1980	director,producer,actor	tt0040746,tt0054215,tt0052357,tt0053125
nm0000034	William Holden	1918	1981	actor,soundtrack	tt0046359,tt0047437,tt0074958,tt0043014
nm0000035	James Horner	1953	2015	music_department,soundtrack,composer	tt0499549,tt0120746,tt0120647,tt0120338
nm0000036	Buster Keaton	1895	1966	actor,writer,director	tt0017925,tt0015324,tt0016332,tt0019421
nm0000037	Gene Kelly	1912	1996	soundtrack,actor,director	tt0043278,tt0041716,tt0053946,tt0045152
nm0000038	Grace Kelly	1929	1982	actress,soundtrack	tt0046912,tt0046874,tt0047396,tt0048728
nm0000039	Deborah Kerr	1921	2007	actress,soundtrack	tt0039192,tt0045793,tt0050105,tt0049408
nm0000040	Stanley Kubrick	1928	1999	director,writer,producer	tt0120663,tt0072684,tt0062622,tt0066921
nm0000041	Akira Kurosawa	1910	1998	writer,director,assistant_director	tt0089881,tt0047478,tt0080979,tt0051808
nm0000042	Alan Ladd	1913	1964	actor,producer,camera_department	tt0035432,tt0034798,tt0046303,tt0038369
nm0000043	Veronica Lake	1922	1973	actress,soundtrack,producer	tt0035432,tt0038369,tt0034798,tt0034240
nm0000044	Burt Lancaster	1913	1994	actor,producer,miscellaneous	tt0045793,tt0051036,tt0050468,tt0080388
nm0000046	Vivien Leigh	1913	1967	actress,soundtrack,writer	tt0033238,tt0031381,tt0044081,tt0034272
nm0000047	Sophia Loren	1934	\N	actress,soundtrack	tt0060121,tt0076085,tt0058335,tt0054749
nm0000048	Peter Lorre	1904	1964	actor,soundtrack,writer	tt0034583,tt0033870,tt0036613,tt0022100
nm0000049	Henry Mancini	1924	1994	music_department,soundtrack,composer	tt0057413,tt0383216,tt0085101,tt0054698
nm0000050	Groucho Marx	1890	1977	soundtrack,actor,writer	tt0023969,tt0026778,tt0023027,tt0028772

Die themoviedb ist ein Füllhorn, Sehr gute API



Selten gesehenes Archivmaterial und klassische Fotos unterstreichen die persönlichen Zeugnisse. Lassen Sie sich inspirieren. "," Beliebtheit ": 13.789," poster_path ":" / bvHjKTLFIHOHzl0arxzu2fYtLfR.jpg "," release_date ":" 2012-02-09 "," title ":" I Am Bruce Lee "," video " : false, "vote_average": 7.7, "vote_count": 82}, {"adult": false, "background_path": "/ 6B4rXwuo4dmVQUcUHOAKXXfMLip.jpg", "genre_ids": [99], "id": 37588, "original_language ":" en "," original_title ":" Bruce Lee: Die Reise eines Kriegers "," Übersicht ":" Der legendäre Kampfkünstler Bruce Lee ist das Thema dieses nachdenklichen Dokumentarfilms des Lee-Liebhabers John Little. Mit Interviews, Viele dieser Standorte bleiben fast ein halbes Jahrhundert später weitgehend unverändert. In Klöstern, Eisfabriken und auf städtischen Straßen erkundet Little die realen Umgebungen von Lees legendärer Karriere. Dieser Film baut auf Little's früherem Film Pursuit of the Dragon auf und bietet einen umfassenden Überblick über Lees Arbeit, der die Art und Weise, wie Sie die Filme sehen, verändern wird. "," Beliebtheit ": 11.042," poster_path ":" / awfKm1lFXoU4YJIbTYRtlCWNAQy.jpg ", "release_date": "2016-10-25", "title": "Bruce Lee: Tracking the Dragon", "video": false, "vote_average": 6, "vote_count": 3}, {"adult": false , "backdrop_path": null, "genre_ids": [28,99], "id": 51240, "original_language": "en", "original_title": " Bruce Lee - The Intercepting Fist "," Übersicht ":" Verfolgen Sie die Transformation des weltberühmten Kampfkunst-Stars Bruce Lee von seinen frühen Jahren als junger Student bis zu seinen letzten Tagen als erfahrener Meister und Bildschirmlegende. Seltene Filmclips und Vintage ... Lesen Sie mehr hinter den Kulissen. Dies zeigt Lees bedeutenden Beitrag zu Hollywoods Kampfkunst-Action-Genre. Zu den Bonus-Features gehören Szenen aus seinem unvollendeten Film Game of Death und Clips seines Fernsehauftritts in der Serie "Longstreet", "Popularität": 5.66, "poster_path": "/ rtJcV5Rdfrhp8rPhGDCszMGM0Jk.jpg", "release_date": " 1998-01-01 "," title ":" Bruce Lee - The Intercepting Fist "," video ": false," vote_average ": 0," vote_count ": 0}, {" adult ": title ":" Wie Bruce Lee die Welt veränderte "," video ": false," vote_average ": 8.3," vote_count ": 24}, {" adult ": false," backdrop_path ": null," genre_ids ": [99 ], "id": 54844, "original_language": "en", "original_title": "The Real Bruce Lee", "Übersicht": "The Real Bruce Lee ist eine Kampfkunstdokumentation. Es beginnt mit einer kurzen Biografie von Bruce Lee und zeigt Szenen aus vier seiner Kindheitsfilme, Bad Boy, Orphan Sam, Kid Cheung und The Carnival, die jeweils sepiafarben und auf Englisch synchronisiert sind. Als nächstes gibt es eine dreiminütige Highlight-Rolle von Lee-Nachahmer Bruce Li. Schließlich gibt es einen Langspielfilm mit dem Lee-Nachahmer Dragon Lee, der offensichtlich Bruce Lees Fist of Fury nachempfunden ist. "," Popularity ": 3.641," poster_path ":" / qHvl0KU7ChzcMnVmzteDcLFFgvk.jpg "," release_date ":" 1977-01-13 "," title ":" The Real Bruce Lee "," video ": false," vote_average ": 6.4," vote_count ": 8 }, {"adult": false, "backdrop_path": "/ 5QaxeWYpQpa7O2LXTF82fLMk21w.jpg", "genre_ids": [28,18], "id": 287239, "original_language": "en", "original_title": "The Legende von Bruce Lee "," Überblick ":" Die Geschichte der legendären Kampfkunstikone Bruce Lee, die ihm von Hongkong nach Amerika und wieder zurück folgt. Filmschnitt aus der gleichnamigen chinesischen Fernsehserie mit 50 Folgen. "," Beliebtheit ": 4.606," poster_path ":" / ypgnDYyV71d3QlK08KiAjdQ3uh2.jpg "," release_date ":" 2010-09-21 "," title ":" Die Legende von Bruce Lee "," video ": false," vote_average ": 5.6," vote_count ": 10}, {" adult ": false," backdrop_path ": null , "genre_ids": [99], "id": 167679, "original_language": "en", "original_title": "Das Leben von Bruce Lee", "Übersicht": "Dokumentarfilm über den Kampfkunstschauspieler Bruce Lee, aus seiner Geburt 1940 bis zu seinem Tod 1973 mit Interviews mit seinen Schauspielerkollegen und seiner Familie. Seinem Sohn Brandon gewidmet. "," Popularität ": 4.4," poster_path ":" / dXCuW2urSFcNAxLtxhwxqQePZUB.jpg "," release_date ":" 1994-01-01 "," title ":" The Life of Bruce Lee ", "video": false, "vote_average": 6.5, "vote_count": 4}, {" Adult ": false," backdrop_path ": null," genre_ids ": [99]," id ": 123542," original_language ":" en "," original_title ":" Bruce Lee: Auf der Suche nach dem Drachen "," Übersicht ":" Dokumentarfilm des berühmten Bruce Lee-Anhängers John Little, der die Chronologie von Lees vier Filmen nachzeichnet. Little folgt Lees Spuren von Macau über Rom und Hongkong und kombiniert neu gemasterte Clips aus Lees Filmen und Interviews mit wichtigen Darstellern und Crewmitgliedern, um einen einzigartigen Einblick in Lees Filmstil zu bieten. Dies ist der ultimative Leitfaden für Lees kurze, aber inspirierende Filmkarriere. "," Popularität ": 6.096," poster_path ": null," release_date ":" 2011-01-01 "," title ":" Bruce Lee: In Pursuit " des Drachen "," Video ": falsch, Die Karate-Kicking-Compilation zeigt den echten Bruce Lee und seine vielen Klone sowie Chuck Norris, Jim Kelly und mehr. Hier ist Bruce, der The Green Hornet als Kato unterstützt, gegen Norris in Return of the Dragon kämpft und seinen letzten vollständigen Film Enter the Dragon sowie die Geheimnisse seines mysteriösen Todes in Bruce Lee ... His Last Days dreht. Sie werden auch sehen, wie Lo Lieh Lee Van Cleef in The Stranger and the Gunfighter herausfordert, Bruce Li die Tradition mit The Three Avengers fortsetzt und Tae Kwon Do-Großmeister Jhoon Ree in The Tattooed Dragon. "," Beliebtheit ": 3,33, "poster_path": "/ AwlZ49VBnosTWBJjJWV5x8gIuQy.jpg", "release_date": "1992-01-01", "title": "Bruce Lee und Kung Fu Mania", "video": false, "vote_average": 7,5, "vote_count ": 1}, {" Erwachsener ": falsch," backdrop_path ": null," genre_ids ": [28,99,18]," id ": 167005," original_language ":" en "," original_title ":" Bruce Lee in GOTT "," Übersicht ":" Bruce Lee in GOTT ist ein "Dokudrama" über die Dreharbeiten zu Game of Death. Die ersten 40 Minuten des Films sind eine Dramatisierung der Ereignisse, bevor Lee die Dreharbeiten für GOTT für Enter the Dragon abbrach, durchsetzt mit Interviews mit Personen, die mit dem Film in Verbindung stehen. Der Rest des Films ist ein alternativer Ausschnitt des gefundenen Game of Death-Filmmaterials. "," Beliebtheit ": 2.416," poster_path ": null," release_date ":" 2000-11-25 "," title ":" Bruce Lee in GOTT "," Video ": falsch," Abstimmungsdurchschnitt ": 6," Abstimmungszahl ": 1}, {" Erwachsener ": falsch," Hintergrundpfad ": und Theorien über den mysteriösen Tod von Bruce Lee und seinem Sohn Brandon. Plus seltenes Filmmaterial und mehr! Obwohl sein Leben im Alter von 32 Jahren verkürzt wurde, wird Bruce Lee - durch seine Filme und seine Lehren - für immer als der unsterbliche Drache in Erinnerung bleiben! "," Popularität ": 2.695," poster_path ":" / gMRnEKRXUZ34VbCM2QVA63D2Lmk.jpg "," release_date ":" 1994-01-18 "," title ":" Bruce Lee: Der unsterbliche Drache "," video ": false," vote_average ": 6.1," vote_count ": 4}, {" adult " : false, "backdrop_path": "/ jPgGTl0nnkknJHZoil1IB3nppru.jpg", "genre_ids": [35,99], "id": 13983, "original_language": "en", "original_title": "Beenden des Spiels: Die Suche nach ein neuer Bruce Lee "," Überblick ": ab 1971. Der Kampfkunst-Experte Bruce Lee wurde weltbekannt für seine Auftritte in Kung-Fu-Klassikern wie ENTER THE DRAGON. Jetzt ist sein einziges Interview auf Englisch verfügbar. Kurz nach der Veröffentlichung seines ersten Films THE BIG BOSS sprach er in Hongkong mit Kanadas führendem Journalisten Pierre Berton. Dies ist der nächste Weg zu diesem außergewöhnlichen Meister. "," Popularität ": 2.669," poster_path ":" / wVIgNSuX3TQ4rTCAXFTvSyiCEMZ.jpg "," release_date ":" 1971-12-09 "," title ":" Bruce Lee : The Lost Interview "," Video ": false," vote_average ": 8,5," vote_count ": 23}, {" adult ": false," backdrop_path ": null," genre_ids ": [99,28]," id ": 672748," original_language ":" en "," original_title ":"
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Fette Dateien richtig einlesen

30 Apr 2021, 01:10

AFAICS ist das Dateiformat Space/Tab-separated, wobei der jeweilige
kommaseparierte "Zell-Inhalt" beliebig angeordnet sein kann (siehe Vergleich Fred Astaire vs Brigitte Bardot). Also einfach zu konvertieren.
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fette Dateien richtig einlesen

30 Apr 2021, 08:30

Moin,

ich habe mal mit den Daten herumprobiert. Ich habe mir die Data.tsv aus name.basics.tsv.gz heruntergeladen. Wenn man es mit #MaxMem bzw. VarSetCapacity() vorbereitet, kann AHK (X64) die Datei tatsächlich bewältigen. Es erfordert aber sehr viel Geduld, wenn man auf den Inhalt zugreifen will.

So kommt es darauf an, was konkret Du mit den Daten anstellen willst. Mit Hilfe der SQLite3.exe war es sehr einfach möglich, die Datei 'on the fly' in eine Datenbank mit gleicher Struktur umzuwandeln. Die resultierende DB-Datei ist etwa 10 % gößer als das Original.

Also nochmal: Was willst Du mit den Daten machen?

@BoBo: Die Datei ist tatsächlich 'Tab-separated'.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Fette Dateien richtig einlesen

30 Apr 2021, 09:25

@BoBo: Die Datei ist tatsächlich 'Tab-separated'.
Und plötzlich macht die Dateiendung *.tsv sogar für mich Sinn :lol: :thumbup:
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Fette Dateien richtig einlesen

30 Apr 2021, 11:24

just me wrote:
30 Apr 2021, 08:30
..Was willst Du mit den Daten machen?..
Ich möchte lernen, für viele Projekte die ich hier poste habe ich keinerlei Anwendung, meistens gehts mir nur darum es zu können.

Und eine SQL Datenbank wäre auf dieser 'können' Wunschliste ganz oben.

Wenn Du die Geduld hast mir zu zeigen wie ich diese Datensätze in einer SQL Datenbank umsetzen kann, dann wäre das für mich wohl die beste Lösung.

Was ich machen möchte kann ich dir daher nicht so genau beantworten, wenn ich mir aber vorstelle auf all diese Daten dieser Tabellen zugreifen zu können, dann ergeben sich am Ende gewaltige Möglichkeiten der Abfrage von Film und Darsteller Daten und den durch API reinkommenden Datensätzen

A_AhkVersion: 1.1.32.00
A_Is64bitOS: 1
A_OSVersion: 10.0.18363
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fette Dateien richtig einlesen

02 May 2021, 11:04

@effel, kurze Zwischennachricht: Es wird wohl noch bis morgen dauern, ehe ich etwas einstelle.

Bis dann!
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fette Dateien richtig einlesen

09 May 2021, 07:23

Moin,

heute ist morgen. Ich wollte das alles noch etwas komfortabler gestalten, doch mir kamen nicht die richtigen Eingebungen. Ich schlage deshalb Folgendes vor:
  1. Verkleinern der TSV-Dateien während der Übungsphase:
    Ich habe ja unten bereits gesagt, dass die .import Anweisung der Sqlite3.exe auch mit der kompletten data.tsv aus name.basics.tsv.gz zurecht kommt. Dabei gab es lediglich ein paar Fehlermeldungen zum Inhalt einzelner Sätze, denen ich aber nicht weiter nachgegangen bin. Mit der großen Datenbank kann man allerdings ein AHK-Skript mit unvorsichtigen Abfragen leicht in die Knie zwingen. Zum Üben ist es deshalb wohl besser, die Datenmenge zu verringern. Ich habe das mit folgendem Skript getan.

    Code: Select all

    #NoEnv
    #MaxMem 1024
    SetBatchLines, -1
    FileEncoding, UTF-8
    Records := 2000
    TSV_File := A_ScriptDir . "\data.tsv"
    Out_File := A_ScriptDir . "\data_2000.tsv"
    Out := ""
    VarSetCapacity(Out, 1073741823 << !!A_IsUnicode)
    Loop, Read, %TSV_File%
       Out .= (Out <> "" ? "`r`n" : "") . A_LoopReadLine
    Until (A_Index = Records)
    OF := FileOpen(Out_File, "w")
    OF.Write(Out)
    OF.Close()
    ExitApp
  2. Datenbank erstellen:
    Dazu braucht man die Sqlite3.exe aus https://www.sqlite.org/2021/sqlite-tools-win32-x86-3350500.zip und die TSV-Dateien, am besten im selben Verzeichnis. Eine neue Datenbank wird dann wie folgt erstellt.
    1. Ggf. eine vorhandene Datenbankdatei löschen.
    2. Sqlite3.exe per Doppelklick starten
    3. Im Kommandofenster das Kommando .open datenbankname.extension eingeben.
    4. Im Kommandofenster das Kommando .mode tabs eingeben.
      Damit wird der Feldtrenner auf Tabs umgestellt.
    5. Im Kommandofenster das Kommando .import tsvdateiname.tsv tabellenname eingeben.
      Damit wird der Inhalt der Datei in die vorgegebene Tabelle importiert. Ich habe als Tabellennamen data verwendet.
    6. Abwarten, bis der Import fertig ist.
    Und fertig ist die Datenbank.
  3. Mit der Datenbank üben:
    Ich habe dafür folgendes Skript erstellt:

    Code: Select all

    #NoEnv
    #SingleInstance force
    SetWorkingDir, %A_ScriptDir%
    SetBatchLines, -1
    ; ----------------------------------------------------------------------------------------------------------------------
    ; Neue DB Instanz erstellen
    DB := New SQLiteDB
    ; ----------------------------------------------------------------------------------------------------------------------
    ; Gui Menü erstellen
    Menu, Datei, Add, Datenbank öffnen, OpenDB
    Menu, Datei, Add, Beenden, GuiClose
    Menu, GuiMenu, Add, &Datei, :Datei
    ; ----------------------------------------------------------------------------------------------------------------------
    ; Gui erstellen
    Gui, Menu, GuiMenu
    Gui, Margin, 10, 10
    Gui, Font, s10
    Gui, Add, Edit, w800 vSQL
    Gui, Font
    Gui, Add, Button, xm y+5 w200 vBtn1 gGetAll Disabled, Alle anzeigen
    Gui, Add, Button, x+100 yp w200 vBtn2 gGetTable Disabled, SQLite GetTable
    Gui, Add, Button, x+100 yp w200 vBtn3 gExec Disabled, SQLite Exec
    Gui, Add, ListView, xm w800 r25 vLV hwndHLV
    Gui, Font, s10
    Gui, Add, StatusBar
    SB_SetParts(10)
    Gui, Show, , DB-Viewer
    Return
    ; ----------------------------------------------------------------------------------------------------------------------
    GuiClose:
       DB.Close()
    ExitApp
    ; ----------------------------------------------------------------------------------------------------------------------
    OpenDB:
       SelectedFile := ""
       FileSelectFile, SelectedFile, 3, %A_ScriptDir%, Datenbank öffnen, DB (*.db;*.sqlite)
       If (ErrorLevel)
          Return
       If !DB.OpenDB(SelectedFile) {
          MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
          Return
       }
       DBFile := SelectedFile
       Gosub, GetAll
       GuiControl, Enable, Btn1
       GuiControl, Enable, Btn2
       GuiControl, Enable, Btn3
       Gui, +LastFound
       WinSetTitle, DB-Viewer - %DBFile%
    Return
    ; ----------------------------------------------------------------------------------------------------------------------
    ; Komplette Tabelle 'data' auslesen und in das ListView übertragen
    GetAll:
       SQL := "SELECT * FROM data;"
       GuiControl, , SQL, %SQL%
       Table := ""
       GuiControlGet, SQL
       If !DB.GetTable(SQL, Table) {
          MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
          GoSub, GuiClose
       }
       ShowTable(Table)
       SB_SetText(Table.Rowcount . " Sätze mit " . Table.ColumnCount .  " Spalten verarbeitet!", 2)
    Return
    ; ----------------------------------------------------------------------------------------------------------------------
    ; DB.GetTable ausführen und das Ergebnis in das ListView übertragen
    GetTable:
       Table := ""
       GuiControlGet, SQL
       If !DB.GetTable(SQL, Table) {
          MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
          Return
       }
       ShowTable(Table)
       SB_SetText(Table.Rowcount . " Sätze mit " . Table.ColumnCount .  " Spalten verarbeitet!", 2)
    Return
    ; ----------------------------------------------------------------------------------------------------------------------
    ; DB.GetTable ausführen und das Ergebnis ausgeben
    Exec:
       GuiControlGet, SQL
       If !DB.Exec(SQL) {
          MsgBox, 16, SQLite Error, % "Msg:`t" . DB.ErrorMsg . "`nCode:`t" . DB.ErrorCode
          Return
       }
       SB_SetText(DB.Changes . " Sätze verarbeitet!", 2)
    Return
    ; ----------------------------------------------------------------------------------------------------------------------
    ShowTable(Table) {
       GuiControl, -Redraw, LV
       LV_Delete()
       Loop, % LV_GetCount("Column")
          LV_DeleteCol(1)
       If (Table.HasNames) {
          Loop, % Table.ColumnCount
             LV_InsertCol(A_Index,"", Table.ColumnNames[A_Index])
          If (Table.HasRows) {
             Loop, % Table.RowCount
                LV_Add("", Table.Rows[A_Index]*)
          }
          Loop, % Table.ColumnCount
             LV_ModifyCol(A_Index, "AutoHdr")
       }
       GuiControl, +Redraw, LV
    }
    ; ----------------------------------------------------------------------------------------------------------------------
    #Include Class_SQLiteDB.ahk
    Über das Menü Datei öffnest Du eine Datenbank. Deren Daten müssen in der Tabelle data abgelegt sein.
    Nach dem Öffnen wird der komplette Inhalt der Tabelle data im ListView angezeigt. Diese Anzeige kannst Du jederzeit über den Button Alle anzeigen wiederherstellen.
    Nun kannst Du im Edit SQL-Anweisungen eingeben. Diese werden mit den Buttons SQLite GetTable (für lesende Abfragen wie SELECT) oder SQLite Exec (für schreibende Anweisungen wie DELETE\INSERT\UPDATE) ausgeführt. Das Ergebnis wird im ListView (Abfragen) und/oder in der Statuszeile angezeigt.
Das war's erst einmal. Viel Spaß!
Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: Fette Dateien richtig einlesen

09 May 2021, 15:16

Ich kann den DB Browser für SQLite sehr empfehlen:
Hier als Portable Version: https://portableapps.com/apps/development/sqlite_database_browser_portable

Da kann man bequem alle Tabellen anlegen, SQL-Statements testen, Daten importieren usw...
regards,
AHK_fan :)
https://hr-anwendungen.de
effel
Posts: 544
Joined: 16 Jan 2018, 13:34

Re: Fette Dateien richtig einlesen

11 May 2021, 09:44

Ahk_fan wrote:
09 May 2021, 15:16
...Ich kann den DB Browser für SQLite sehr empfehlen...
Hallo Ahk_fan, Danke Dir, ich jetzt auch :idea:

Meine ersten Versuche mit einem SQL Statement fruchten sofort. Vielleicht kannst du mir ein paar Tips geben, wie ich solche Anfragen über mehrere Tabellen stelle..


Hallo Just Me,
auch Dir meinen Dank, als es dann ein paar Tage länger dauerte, wurde mir schon ganz flau im Magen. Aber es war doch überraschend einfach zu verstehen.

Ich durfte mit deiner GUI nur nicht so viele Daten in die Tabelle importieren. Als ich es mit meiner kleinen FilmeDB versuchte, waren die knapp 800 Filme ruckzuck verfügbar.

Die großen Dateien habe ich mit deinem (angepassten) Code gefiltert, danach ließen sich die großen Dateien alle ohne Fehler mit der sqlite3.exe importieren

Kannst Du (oder Du lieber Leser/in) mir ein paar Schnipsel posten, wie ich die SQL Datenbank händeln kann, ohne den DB Browser für SQLite zu nutzen?..

..also wie ich nur via AHK an eine SQL DB herangehen kann. Hier gibt es noch viel zu lernen.


Code: Select all

If FileExist("name.basics.tsv.data.data-CleanUp.tsv")
FileDelete, ("name.basics.tsv.data.data-CleanUp.tsv")
FileOut := FileOpen("name.basics.tsv.data.data-CleanUp.tsv", "w")
FileIn  := FileOpen("name.basics.tsv.data.data.tsv", "r")

if !IsObject(FileOut)
{
    MsgBox Kann "%DateiName%" nicht zum Schreiben öffnen.
    return
}

Loop, Read, name.basics.tsv.data.data.tsv
{
Out := (Out <> "" ? "`r`n" : "") . StrReplace(A_LoopReadLine,"""")
FileOut.Write(Out)
}

FileOut.Close()
FileIn.Close()
MsgBox,,, CleanUp Fertig
.open FilmeDB.DB
.mode tabs
.import FilmeDB.csv data
.database
gui.png
gui.png (69.29 KiB) Viewed 1133 times
just me
Posts: 9450
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Fette Dateien richtig einlesen

11 May 2021, 10:02

Moin effel,

es freut mich, wenn es Dir gefällt. Ein Möglichkeit, mit AHK direkt auf die Datenbanken zuzugreifen, zeigt ja schon das Beispiel von oben. Du kannst jederzeit per freier Eingabe SQL-Statements auf die Datenbank loslassen. Bei großen Datanbanken kannst Du im Skript dafür sorgen, dass nicht zu viele Daten eingelesen werden. Dafür hat die GetTable() Methode den Parameter MaxResult. Die SQL-Anweisung SELECT kennt außerdem die 'Klauseln' LIMIT und OFFSET. Für einfache Abfragen über mehrere Datenbanken werden die per Methode AttachDB() hinzugefügt.

Für die letzten Tipps&Tricks hinsichtlich der SQL-Syntax bin ich aber nicht der richtige Ansprechpartner.
Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: Fette Dateien richtig einlesen

11 May 2021, 15:40

Hi, hier ein Beispiel auf Basis von @just me 's Class

SELECT-Statements sind eigentlich einfach bis sehr kompliziert ;-)

Wenn du 2 Tabellen verknüpfen willst, d..h z.B. in einer 1. Tabelle z.B. eine Nummer hast, die den Bezug zu einer 2. Tabelle bildet, dann kannst du einfach JOINen, das geht über den Befehl JOIN oder wenn es einfach ist mit "="

z.B.

Code: Select all

SELECT m.Nummer, m.Nachname, m.Vorname, q.Bezeichnung FROM Mitarbeiter m, Qualifikation q where q.Nr = m.Qualifikation;
In der Tabelle "Mitarbeiter" (m) in Spalte "Qualifikation" steht nur die Nummer drin, ich will aber die "Bezeichnung" aus Tabelle "Qualifikation"(q) haben. Also setzen ich das Feld "Qualifikation" aus Tabelle "Mitarbeiter" mit dem Feld "Nr" aus Tabelle "Qualifikation" gleich und ermittle aus dem Datensatz die zugehörige "Bezeichnung" --> q.Bezeichnung
In diesem Fall ist es nicht so wichtig ob man m.Qualifikation = q.Nr oder q.Nr = m.Qualifikation schreibt, aber eigetlich sollte man die 2. Variante nehmen, da man ja wissen möchte ob m in q ist. Das fällt einem später nicht auf die Füße.

In dem Beispiel habe ich
- eine Suche implementiert, wenn man in die suchzeile einen Nachnamen beginnt einzugeben wird ab Stringlänge > 3 in der Datenbank gesucht mit LIKE %Suchstring%
- und einen INSERT wenn man einen neuen Mitarbeiter anlegt

Hier gab es ein ähnliches Thema, da aber auf der SQLite-Class von @IsNull basiert, ich bin da auf die von Justme umgestiegen:
https://www.autohotkey.com/boards/viewtopic.php?f=9&t=87023

PS:
Ich habe übriges die entpackte gz-Datei mit dem DB-Browser als CSV importiert, als Trennzeichen TAB eingestellt, ging auch ne ewigkeit, hat aber funktioniert.
Attachments
db_test.zip
(1.44 MiB) Downloaded 22 times
Last edited by Ahk_fan on 11 May 2021, 16:09, edited 3 times in total.
regards,
AHK_fan :)
https://hr-anwendungen.de
Ahk_fan
Posts: 237
Joined: 31 Aug 2018, 14:34
Contact:

Re: Fette Dateien richtig einlesen

11 May 2021, 15:44

@BoBo sorry, ich habe erst zu spät gesehen dass du den SQLite DB Browser schon in den Links drin hattest...
regards,
AHK_fan :)
https://hr-anwendungen.de
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Fette Dateien richtig einlesen

11 May 2021, 23:41

Ahk_fan wrote:
11 May 2021, 15:44
@BoBo sorry, ich habe erst zu spät gesehen dass du den SQLite DB Browser schon in den Links drin hattest...
Krieg is schlimmer ;)

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 49 guests