כיצד להציל בבטחה קבצים עם קידוד מעורב בעיבוד אצווה: למה בניתי את הכלי הזה
מבוא
בניית הכלי הזה נבעה מסיבה פשוטה. לעשות את זה ידנית בכל פעם היה מתיש.
CSV ממערכות פנימיות, קבצים מ-Excel וקובצי הגדרות שיוצאו מ-Linux, Windows או מסדי נתונים. ברגע שמקור הקובץ משתנה, גם הקידוד, סיומות השורה וה-BOM משתנים.
- חושבים שזה UTF-8, ובפועל Shift_JIS
- חושבים שזה LF, ובפועל CRLF
- יש מערכות שדורשות BOM ואחרות נשברות ממנו
בדיקה והמרה לפי עין ותחושת בטן לא ניתנות להגדלה בקנה מידה. לכן בניתי כלי שמקבל קבצים מכל מקור ומאחד פלט לפי דרישות היעד.
הכאב האמיתי אינו קובץ שבור אחד
אם נשבר קובץ אחד, בדרך כלל אפשר להציל אותו. הקושי מתחיל כשמגיעים יחד 10 או 100 קבצים ממקורות שונים.
בנוסף, לכל מערכת יעד יש הגדרה אחרת של “נכון”.
- מערכת A מקבלת רק UTF-8 ללא BOM
- מערכת B יציבה יותר עם UTF-8 ו-BOM
- מערכת C מניחה Shift_JIS; UTF-8 נראה קריא אך הייבוא נכשל
במצב כזה, ההמלצה “פשוט לאחד ל-UTF-8” לא מועילה. צריך תהליך בטוח, שחוזר על עצמו, ומותאם ליעד.
מה רציתי להשיג עם הכלי
שלושה עקרונות בלבד:
- לקבל קבצים מכל מקור
- להמיר לפי דרישות מערכת היעד
- לא להגדיל תקלות גם בעיבוד אצווה
זה לא כלי ראווה טכני, אלא כלי להפחתת חיכוך תפעולי.
התהליך שבו אני משתמש בפועל
1. קובעים קודם את מפרט הפלט
מתחילים מהפלט, לא מהקלט. מקבעים שלושה פריטים:
- קידוד (UTF-8 / Shift_JIS וכו')
- סיומת שורה (LF / CRLF)
- BOM (עם / בלי)
אם זה נשאר עמום, התוצאה תשתנה לפי מי שמפעיל.
2. מחלקים את היעד לקבוצות קטנות
לא מריצים הכול בבת אחת. מחלקים לפי מערכת, תקופה או סוג קובץ ומתחילים באצוות קטנות.
הסיבה: אם יש כשל, אפשר לבצע rollback. הרצה חד-פעמית של כל הנפח מהירה רק כשהיא מצליחה.
3. מקבעים תנאים ומריצים המרה באצווה
ב-ממיר הקידוד מקבעים תנאים לפי יעד. לא משנים הגדרות באמצע. המפתח הוא שחזוריות.
4. לא לקבוע הצלחה לפי בדיקה ויזואלית בלבד
“הקובץ נפתח, אז הכול תקין” הוא שער לתקלות. לפחות צריך לבדוק:
- שמספר השורות זהה לפני/אחרי
- שמספר העמודות ב-CSV/TSV לא נשבר
- ש-
�(תו החלפה) לא גדל - שעמודות מפתח (ID/Code) שמרו על אורך וסוג תווים
אם בדיקות אלה נכשלות, לא ממשיכים לייבוא.
BOM אינו עניין אידאולוגי, אלא דרישת הצד השני
ויכוח BOM/ללא BOM כמעט לא מועיל בתפעול. מה שקובע הוא איך המערכת בצד השני קוראת את הקובץ.
- אם הצד השני יציב עם BOM — מוציאים עם BOM
- אם BOM שובר אותו — מוציאים בלי BOM
העדיפות היא לא “פורמט נכון תיאורטית”, אלא “פורמט שלא שובר את הצד השני”. כך נראה תפעול אמיתי.
הערך של הכלי אינו ההמרה עצמה
הערך האמיתי הוא בשני דברים:
- ההחלטה לא תלויה באדם מסוים
- עלות בדיקות חוזרות יורדת
אי אפשר לאפס לגמרי תקלות קידוד. אבל אפשר להפסיק לחזור על אותן תקלות. לכן הכנתי כלי שמקבל הכול ומחזיר פלט מיושר לייעוד.
סיכום
הכלי הזה לא נוצר מתיאוריה אידיאלית. הוא נוצר כדי לחסל את התאמות הקידוד המעייפות שחוזרות שוב ושוב בשטח.
לקבל קבצים ממקורות שונים, ליישר קידוד/סיומות שורה/BOM לדרישות היעד ולהחזיר פלט עקבי. עצם האוטומציה של הזרימה הזו כבר מקלה מאוד על התפעול.
טיפול בג’יבריש אינו משימה של כוח רצון. צריך להפוך אותו לנוהל שניתן לשחזור, כך שכל אחד יקבל אותה תוצאה. רק אז אפשר לומר שמדובר בהצלה בטוחה באצווה.