בחודשים האחרונים, במקביל ללימודי הספרנות שלי, אני עובד במשרה חלקית בסטארט-אפ קטן בשם kensee.co שמפתח תוכנה לניתוח אוטומטי של טקסטים במבנה חופשי.
במסגרת העבודה שלי אני רואה וקורא המון טקסטים, "טבעיים" ומעובדים, וכדי לייעל את העבודה שלי אספתי לעצמי כמה שיטות וכלים שעליהם אספר כאן.
אם גם לכם יש עוד שיטות וכלים, אשמח אם תשתפו בתגובות.
באג יבוא CSV לאקסל
תלשתי כמה שערות שאין לי עד שהבנתי שזה באמת באג ואני לא מדמיין. ראיתי את הבאג הזה באקסל 2013 על חלונות 8/10. כן, בלינוקס/אופן אופיס זה לא היה קורה.
יצוא קבצים מ Database נעשה הרבה פעמים לקובץ CSV. פעם, השדות בקבצי CSV היו מופרדים בפסיקים, מכאן השם. היום, השם CSV הוא ג'נרי ויכול לכלול פורמט של קבצי טקסט טבלאיים כשהשדות מופרדים עם כל מה שרוצים.
לדוגמא, התוכנה MySQL Workbench מאפשרת יצוא קבצי CSV רק עם המפרידים TAB, נקודה פסיק ; ונקודותיים :.
כאשר אני פותח את הקובץ באקסל ומשתמש בתכונה Data > Text to Columns ובוחר במפריד אחר מפסיק, אקסל עדיין חושב שמכיוון שזה הוא קובץ CSV המפריד הוא גם פסיק. כתוצאה מכך, אובד מידע עם פסיקים.
יש לזה שני פתרונות.
- לשנות את סיומת הקובץ ל TXT.
- לייבא את הקובץ לא על ידי פתיחה אלא על ידי התכונה Data > Get external data from text
לא מאמינים? נסו בעצמכם. הרשומות מופרדות עם TAB.
ניתוח קבצי LOG בעזרת שפת התכנות AWK
כבודק התוכנה של החברה, ניתנה לי האפשרות לאפיין את קבצי ה LOG של התהליכים.
באיפיון הנחו אותי שני עקרונות – קריאה נוחה "בעין" של הקבצים והכנה נוחה לעיבוד אוטומטי שלהם.
איפה שהוא בפינת המוח שלי זכרתי את שפת AWK אשר הופיעה לראשונה בשנת 1977 בעולם ה UNIX.
AWK מיועדת לעיבוד קבצי טקסט.
הלולאה הבסיסית של השפה היא "קבל את השורה הבאה מהקובץ" ולכן לא צריך לכתוב קוד כדי פתוח את הקובץ ולבצע את פעולת הקריאה והמעבר לשורה הבאה. השפה גם מניחה שבכל שורה יש שדות מופרדים והיא מכניסה כל שדה למשתנה פנימי. תוכן כל השורה נמצא בשדה $0, השדה הראשון הוא $1 וכן הלאה.
קריאת קובץ בגודל של יותר מ 150 מגה/ 1,250,000 שורות והכנסתו למערך לוקחים 4 שניות. מיון המערך, מעבר על השורות שבו, השוואות עם כמה פרמטרים ולולאות מערכים אחרים והדפסה לקובץ של יותר מ 100,000 שורות לוקחים דקה וחצי.
אני חושב שזה לא רע בכלל.
קובץ ה LOG שהתכנה שלנו מפיקה הוא לא בצורת שורה לרשומה. לכל רשומה יש כמה שורות בפורמט ID,Parameter,Data
הנה דוגמה למבנה הקובץ. באמת, יש לכל רשומה יותר משלושים שורות.
כדי לעשות עיבודים על הקובץ, אני מכניס את כולו למערך, מבצע מיון, עובר על המערך ומכין פלט לפי הנושא שאני בודק.
הייתי יכול לעשות אותו דבר בשפות אחרות אבל ב AWK הכל יותר פשוט לי. זו שפה שמתכנתים מוכשרים ממני (אני ממש גרוע) יכולים ללמוד מהר ולהפיק ממנה המון.
אם אתם עוסקים בניתוח קבצי טקסט, אני מאד ממליץ לכם לבדוק את התוכנה.
קוד פתוח, עובד על כל הפלטפורמות והמון הסברים ברשת.
שאילתות SQL על קבצי CSV
גיליתי את התוכנה הזאת רק אתמול ועדיין לא השתמשתי בה אבל היא נראית לי מגניבה ושימושית.
הקלט של התוכנה הוא קובץ CSV ושאילתת SQL רגילה.
התוכנה מעלה את הקובץ ל SQLite מבצעת את השאילתא ומחזירה את התוצאה.
לדוגמה, כדי למצוא רשומות כפולות אפשר לבדוק קובץ CSV עם הפקודה הבאה.
SELECT URL, COUNT(URL) FROM articles GROUP BY URL HAVING ( COUNT(URL) > 1 )
שימוש בתוכנה יכול לחסוך שלבים רבים של העלאת קובץ טקסט לאקסל וביצוע שאילתות ועיבודים – ראו את הסעיף הראשון בפוסט.
חיפוש ב ++Notepad
זהו עורך הטקסט המועדף עלי ועל הרבה אחרים.
יש בו תכונה מעצבנת. אפשר לבצע בו חיפוש או למעלה או למטה.
אם לא מוצאים, צריך ללחוץ על הכפתור כדי לחפש בכיוון השני.
היום החלטתי להפסיק להתעצבן וגיגלתי אחר פתרון, מתוך הנחה שאני לא היחידי שההתנהגות הזו מעצבנת אותו.
הפתרון הוא צ'קבוקס צנוע עם טקסט מבלבל. סמנו אותו ו NPP יבצע חיפוש בכיוון למטה, עד הסוף ואז יקפוץ לראש הקובץ וימשיך לחפש.
למציאת שורות כפולות בקובץ אין צורך בתותח של SQL.
שילוב פקודות בסיסיות יתן את התוצאה בקלילות ובמהירות.
sort File | uniq -c | sort -n
ואפשר להוסיף בסוף גם '{awk '$1>X {print אם רוצים לקבל כפלט רק את השורות שמופיעות יותר מX פעמים.
I am the maintainer of GNU Awk and the author of the book you have pictured. A friend pointed me at this blog. Thanks for the nice words; I think you'll find that awk will grow with you as you work with it.
Enjoy!
הי, כאן המפתח של q,
פעם ראשונה שאני רואה שבלוג ישראלי כותב עליה. תודה!
אני אשמח לשמוע רשמים אם השתמשת ואיך הייתה החוייה.
הראל
harelba@gmail.com
שאילתות על קבצי CSV ניתן בצע גם מאקסל. לדוגמה:
Data -> from other sources -> from Microsoft query
awk זה מצויין.
ספציפית לקבצי csv, אוסף הסקריפטים csvkit מומלץ מאוד.
(אני חושב שהוא עובד גם בווינדוס).
https://source.opennews.org/en-US/articles/eleven-awesome-things-you-can-do-csvkit