Command Palette

Search for a command to run...

הבדל CSV: השווה שני קבצי CSV ללא הבדל שורה שיקרה לך

הבדל CSV: השווה שני קבצי CSV ללא הבדל שורה שיקרה לך

T
Toolz Team
|Aug 23, 2026|17 קריאה דקות

חלק מאוסף להבדיל ולהשוות

דוח הבאג שגרם לי לבנות את זה היה באורך שלוש מילים: " הסנכרון מוריד שורות." לקוח ' הזנת המוצר של המוצר הגיעה כ-CSV לילי, יבואן Laravel שלי כתב אותו מחדש, ואיפשהו בין שני הקבצים נעלם קומץ מקט. האינסטינקט הראשון שלי היה המובן מאליו: זרוק את שני הקבצים לתוך קו הבדל. ההבדל חזר אדום מוצק. כל שורה בודדת הייתה " שונה," מכיוון שהיצוא מוין מחדש על ידי עמודה אחרת באותו לילה, אז שורה 4 בקובץ הישן הייתה שורה 900 בחדשה. ההבדל בשורה היה נכון מבחינה טכנית וחסר תועלת לחלוטין. מה שבעצם הייתי צריך זה כלי שהבין שהקובץ הוא טבלה, התאים כל שורה למקבילה שלה על ידי ה-SKU, ואמר לי אילו רשומות באמת נוספו, הוסרו או נערכו הכלי הזה הוא ה-Toolz בודק הבדל CSV, והמדריך הזה הוא ההיגיון מאחוריו.

TL;DR: הבדל CSV משווה שני קבצי CSV כנתונים מובנים במקום כשורות טקסט. התאם שורות לפי עמודת מפתח כגון id או email וכל רשומה מושווה למקבילה בכל מקום שבו היא נעה בקובץ, כך שיצוא ממוין מחדש אינו מדווח על אלפי שינויים כוזבים הכלי Toolz מנתח את שני הקבצים עם מכונת מצב RFC 4180, מפצל את התוצאה לשורות שנוספו, הוסרו ושונו, ומציג את התא המדויק השונה עבור כל שורה שהשתנתה הוא פועל לחלוטין בצד הלקוח: אין העלאה, אין הרשמה, עובד במצב לא מקוון.

אני בונה מוצרי SaaS על Laravel ו-React ואני שולח תוספים של וורדפרס, מה שאומר שאני מבלה זמן רב בהתאמת יצוא: מערכת אחת 's view של הנתונים מול אחר 's, אמש 's snapshot מול tonight's, הקובץ שלקוח נשבע שהם שלחו כנגד הקובץ שהגיע בפועל. CSV הוא השפה הצרפתית לכל זה, והשוואה נכונה של שני CSVs היא אחת המשימות האלה שנראות טריוויאליות עד שמנסים לעשות זאת עם הכלי הלא נכון. זה המדריך שהלוואי שהגרסה המתוסכלת שלי הייתה קוראת.

מהו בודק CSV diff?

בודק CSV diff לוקח שני קבצי CSV, גרסה מקורית ושונתה, ומדווח כיצד השני שונה מהראשון ברמת השורות והתאים במקום פלט השורות שנוספו ונמחקו של הבדל טקסט, אתה מקבל ארבעה דליים: שורות שקיימות רק בקובץ החדש (נוסף), שורות שקיימות רק בקובץ הישן (הוסר), שורות שקיימות בשניהם אך הערכים שלהן שונים (שונה), ושורות זהות (ללא שינוי). עבור כל שורה שהשתנתה, כלי טוב מעמיק ברמה אחת ונותן שמות לעמודות הספציפיות שזזו, ומציג את הערך הישן לצד החדש.

ההבחנה שגורמת לכל העניין לעבוד היא איך שורות מזווגות על פני שני הקבצים. הבדל CSV יכול להתאים על ידי עמודת מפתח, להתייחס לערך כמו an id או an email בתור זהות הרשומה, או שהיא יכולה להתאים לפי מיקום, השוואת שורה אחת לשורה אחת התאמת מפתחות היא מה שאתה רוצה כמעט בכל פעם שאתה משווה יצוא, מכיוון שאותה רשומה יכולה לנחות על שורה אחרת בכל פעם שהנתונים נמשכים התאמת מיקום היא עבור קבצים שבהם מספר השורה עצמו הוא משמעותי ויציב, כמו ספר חשבונות ממוספר שרק אי פעם מצורף אליו בחירת המצב הנכון היא ההחלטה החשובה ביותר, וזו הסיבה שהכלי Toolz שם אותו בחזית ובמרכז במקום לנחש.

מדוע הבדל קו הופך לאדום לחלוטין בייצוא ממוין מחדש?

זהו הכשל ששולח אנשים שמחפשים כלי ספציפי ל-CSV, ולכן כדאי להבין במדויק. a text diff, מהסוג המובנה ב-Git ובכל עורך קוד, משווה קבצים שורה אחר שורה ובסדר הוא מריץ אלגוריתם שמוצא את רצף המשנה הנפוץ הארוך ביותר של שורות ומסמן את כל השאר כמוכנס או נמחק זה בדיוק נכון לקוד מקור, כאשר סדר השורות הוא המשמעות של הקובץ העבר פונקציה ובאמת שינית את הקובץ.

ייצוא CSV הוא הפוך סדר השורות הוא בדרך כלל תאונה של מה שלא יהיה ORDER BY השאילתה השתמשה במקרה, והיא יכולה להשתנות בין שתי ריצות המכילות נתונים זהים ברגע שסדר המיון משתנה, קו diff רואה כמעט כל שורה במיקום חדש, לא מצליח ליישר אותם, ומדווח על כל הקובץ כשונה המידע שרצית, ששלוש רשומות שינו בפועל, קבור תחת אלפי תוצאות חיוביות שגויות. ההבדל עשה את עבודתו בנאמנות; זה פשוט ענה על שאלה לגבי שורות כשהייתה לך שאלה לגבי רשומות.

הבדל CSV מתקן זאת על ידי ניתוח הקובץ לשורות ועמודות תחילה, ולאחר מכן השוואת רשומות לפי המפתח שלהן ולא לפי מספר השורה שלהן. למיון מחדש של הקובץ אין השפעה, כי ה-SKU A-1007 מושווה לשורה עם מקט A-1007 בקובץ השני לא משנה איפה אחד מהם יושב. זו כל הסיבה שהקטגוריה קיימת, וזו הסיבה שאני מושיט יד אל כלי הבדל CSV במקום git diff בכל פעם שהקובץ הוא נתונים ולא קוד.

מה הקשר של RFC 4180 להשוואת קבצים?

הכל, כי אתה לא יכול להשוות שני CSVs נכון אם אתה לא יכול לנתח אותם נכון קודם. CSV שימש במשך עשרות שנים לפני שמישהו תקן אותו. בשנת 2005 פרסם ה-IETF RFC 4180, המתאר את הפורמט הנפוץ ואת text/csv סוג MIME.זה לא חוק שכל כלי מציית לו, אבל זה הדבר הכי קרוב לחוזה משותף, והוא מגדיר את הכללים שהשוואה נאיבית משתבשת.

הכלל שהכי חשוב הוא ציטוט שדה עשוי להיות עטוף במירכאות כפולות, והוא חייב להיות אם הוא מכיל פסיק, ציטוט כפול או הפסקת שורה ציטוט כפול בתוך שדה מצוטט נמלט על ידי הכפלתו אז הערך "Doe, John" הוא שדה בודד, ו "She said ""hi""" הוא הערך She said "hi". השוואה המפצלת כל שורה בפסיקים תחתוך "Doe, John" לשני שדות, העבר כל עמודה אחריה, ולאחר מכן דווח בביטחון שהשורה השתנתה כשלא השתנתה. ההבדל של Toolz מריץ את אותה מכונת מצב RFC 4180 שמפעילה את מציג CSV: הוא הולך על הטקסט תו אחר תו, עוקב אם הוא בתוך שדה מצוטט, ומתייחס רק לפסיק או לשורה חדשה כמפריד כאשר הוא מחוץ לציטוטים. ביצוע הניתוח נכון הוא תנאי מוקדם לביצוע ההבדל הנכון, וזה החלק שסקריפטים מגולגלים ביד מדלגים כמעט תמיד.

כיצד אוכל להשוות שני קבצי CSV עם הכלי?

הזרימה קצרה בכוונה. הדבק את הקובץ המקורי בתיבה הראשונה ואת הקובץ שהשתנה בשנייה, או לחץ על טען מדגם כדי לראות דוגמה עובדת שבה שורה אחת נערכת, אחת מתווספת ואחת מוסרת.

אשר את המפריד. זיהוי אוטומטי של ציונים פסיק, נקודה-פסיק, לשונית וצינור לפי מידת העקביות של כל אחת מהן מפצלת את מספר השורות הראשונות לאותו מספר עמודות, מה שמטפל נכון בקבצי נקודה-פסיק אירופיים וביצוא מופרד כרטיסיות. אם הזיהוי שגוי עבור הנתונים שלך, הגדר אותם ביד. השאר את מתג הכותרת דולק אם השורה הראשונה של כל קובץ מכילה שמות עמודות, וזה מה שמזין את בורר עמודות המפתח.

כעת בחר כיצד שורות מותאמות. בחר עמודת מפתח מהתפריט הנפתח, בדרך כלל id, email, או מקט, והכלי משווה רשומות לפי ערך זה בחר מיקום במקום זאת כדי להשוות שורה אחר שורה. שני מתגים משכללים את ההשוואה: הפעל התאמה לא רגישה לרישיות אם Active ו active צריך לספור כערך זהה, ולהשאיר trim-whitespace על כך מרחב מוביל תועה לא נרשם כשינוי לחץ על השווה, ואת הסיכום מציג ארבע ספירות במבט חטוף פתח את הכרטיסייה השתנה כדי להרחיב כל שורה ערוכה ולראות בדיוק אילו תאים עברו, או את הכרטיסיות הוספה והוסרה כדי לראות את השורות המלאות כטבלה. כשתסיים, העתק דוח או הורדה מייצאת סיכום טקסט רגיל של כל הבדל, כולל הערך לפני ואחרי של כל תא שהשתנה, מוכן להדבקה לבקשת משיכה, כרטיס או אימייל ללקוח.

מתי עלי להתאים לפי מפתח לעומת לפי מיקום?

זו הבחירה שקובעת אם ההבדל שימושי או רעש, אז הנה הכלל שאני משתמש בו, מונח כטבלה.

מצב התאמה לפי למה
ייצוא מסד נתונים או API שניתן למיין מחדש עמודת מפתח אותה רשומה נוחתת על קווים שונים בכל משיכה; המפתח הוא הזהות היציבה שלו
התאמה בין שתי מערכות' תצוגה של אותם רשומות עמודת מפתח אכפת לך אם קיים שיא ומתאים משני הצדדים, לא היכן הוא יושב
השוואה של תמונת מצב של אתמול בלילה 's להלילה 's עמודת מפתח שורות מתווספות ומוסרות עם הזמן, כך שמספרי השורות נסחפים
הוסף יומן או ספר חשבונות בלבד עם הזמנה קבועה עמדה מספר השורה יציב ומשמעותי; שורה N היא באמת " האירוע ה-Nth"
שני קבצים שאתה מכיר חולקים את אותו סדר שורות בדיוק עמדה לא קיים מפתח, אך ההזמנה מובטחת זהה
קובץ ללא עמודה ייחודית כלל עמדה אין על מה להקיש, אז השוו לפי הסדר וקבלו את המגבלה

הגרסה הקצרה: להגיע להתאמת מפתחות כברירת מחדל, מכיוון שרוב ה-CSVs הם יצוא של רשומות הנושאות מזהה. חזור להתאמה מיקוםית רק כאשר אין מפתח שמיש או כאשר סדר השורות הוא באמת חלק מהנתונים. אם תבחר מפתח והכלי מזהיר שהעמודה מכילה ערכים כפולים, כלומר האות, העמודה אינה ייחודית למעשה, ועליך לבחור מפתח טוב יותר או לנקות את המקור. תפסתי יותר מיצוא שבור אחד בדיוק בגלל ש-"unique" עמודת הזיהוי התבררה כלא.

איך זה מראה מה בעצם השתנה ברצף?

ספירה של "5 שורות השתנו" היא התחלה, אבל השאלה שבאמת יש לך היא " שינתה איך?" ההבדל של Toolz עונה על זה בכל שורה. כאשר רשומה מותאמת שונה, היא משווה את שתי הגרסאות עמודה אחר עמודה ומפרטת רק את התאים שעברו, כל אחד מוצג כערך הקודם נמחק לצד הערך החדש. שורת לקוח שבה רק ה plan הטור הלך מ free ל pro מדווח כי תא בודד, לא את כל הרשומה, אז אתה לא נשאר eyeballing שתי שורות ארוכות מנסה לזהות את השדה אחד שהשתנה.

תצוגה זו ברמת התא היא המקום שבו הבדל CSV מרוויח את השמירה שלו על גיליון אלקטרוני ' משלו להשוות תכונות, אשר נוטות להדגיש תאים עם צבע אבל לא נותנים לך שום דבר להעתיק או להדביק לתוך סקירה הדוח המיוצא מאיית כל שינוי בטקסט: המפתח של השורה, שם העמודה והערך הישן והחדש. בפועל אני מדביק את זה ישר לתוך התיאור של בקשת משיכה כדי שסוקר יוכל לראות את השפעת הנתונים של הגירה מבלי לפתוח את הקבצים עצמם. זה אותו אינסטינקט מאחורי המבני JSON diff, אשר מדווח שינו מפתחות עם הנתיבים שלהם ולא שינויי קו רועשים; שני הכלים קיימים כי "מה שינה" היא שאלה טובה יותר מ-" אילו שורות שונות."

האם זה בטוח להשוות קבצי CSV רגישים באינטרנט?

עבור כלי זה, כן, והסיבה היא אדריכלית ולא הבטחה זרת כל שלב, ניתוח שני הקבצים, התאמת שורות, חישוב ההבדלים לתא ובניית הדוח, פועל כ-JavaScript בתוך לשונית הדפדפן שלך. אין העלאה, אין שרת הלוך ושוב, ושום דבר לא נרשם או מאוחסן. אתה יכול להוכיח זאת על ידי פתיחת הדפדפן שלך's לשונית רשת ולחיצה על השווה: אין בקשה עוזבת את הדף. לאחר טעינת הדף תוכל להתנתק לחלוטין מהאינטרנט והוא ממשיך לעבוד.

זה משנה כי CSVs אנשים diff הם בין הקבצים הרגישים ביותר בעל עסק רשימות לקוחות, יצוא עסקאות, שורות שכר, טבלאות מלאי, ו יומני גישה כל נסיעות כמו CSV.כלי השוואה שמעלה את הקבצים שלך לשרת, עם זאת כוונות טובות, הופך שני גיליונות אלקטרוניים פרטיים למישהו אחר & #39;s רשומות יומן עיבוד בצד הלקוח מסיר את השאלה: הנתונים לעולם לא עוזב את המכונה זה התחיל על ברירת המחדל היא מכוונת על פני כל כלי על Toolz.dev, וכתבתי את הארגומנט הארוך יותר ב מדריך פרטיות נתונים לכלים מקוונים לכל מי שרוצה את הנימוק המלא.

כיצד הבדל CSV משתלב בזרימת עבודה אמיתית?

ההבדל הוא רק לעתים רחוקות כל העבודה; זו תחנה אחת בצנרת. הדפוס שפגעתי בו לרוב הוא אימות: אני מפעיל ייבוא או הגירה, ואז הבדל את הייצוא לפני ואחרי כדי לאשר שהסקריפט עשה בדיוק את מה שציפיתי ותו לא. הבדל נקי של "שלושה השתנו, אפס הוסר" הוא סימן הרבה יותר טוב שההגירה עבדה מאשר סימן ביקורת ירוק מהסקריפט שהריץ אותו. כאשר ההבדל מראה הסרה שלא התכוונתי, תפסתי את הבאג לפני שהגיע לייצור במקום אחריו.

הכלים סביבו תלויים במה מיועד הקובץ. אם אני צריך לגלגל עין על קובץ כרשת ניתנת למיון לפני ההשוואה, ה מציג CSV מציג את אותו ניתוח RFC 4180 כמו טבלה. אם ההשוואה שאני רוצה היא באמת על חברות, אילו ערכים מופיעים בקובץ אחד אבל לא השני ולא אילו שורות השתנו, ה השווה כלי שתי רשימות האם להגדיר אריתמטיקה על עמודות בודדות והוא מתאים יותר. וכאשר הנתונים צריכים להפוך למשהו ש-API יכול לצרוך, ה ממיר CSV ל-JSON הוא הקפיצה הבאה אף אחד מאלה לא מעלה את הנתונים שלך, אז אתה יכול לשרשר אותם על אותו קובץ פרטי בלי לחשוב פעמיים אם אתה מרכיב ערכה לעבודת נתונים מסוג זה, שלי מדריך ערכת כלים למפתחי אינטרנט עובר דרך איך החלקים מתחברים.

שאלות נפוצות

כיצד אוכל להשוות בין שני קבצי CSV? פתח את בודק הבדל CSV, הדבק את ה-CSV המקורי בתיבה הראשונה ואת ה-CSV שהשתנה בתיבה השנייה, אשר את הגדרות המפריד והכותרת, בחר עמודת מפתח או התאמת מיקום ולחץ על השווה. התוצאה מפוצלת לשורות שנוספו, הוסרו ושונו, וכל שורה שהשתנתה מציגה את התאים המדויקים השונים. הכל פועל בדפדפן שלך, כך שהקבצים לעולם לא מועלים.

מה ההבדל בין התאמת מקשים להתאמת מיקום? התאמת מפתח זוגות שורות החולקות את אותו ערך בעמודה שנבחרה, כגון id, אז רשומה מושווה למקבילה בכל מקום שהיא מופיעה בכל אחד מהקבצים התאמת מיקום משווה שורה אחת לשורה אחת בסדר קבצים השתמש בהתאמת מקשים עבור יצוא שניתן למיין מחדש, והתאמת מיקום עבור קבצים בסדר קבוע כמו יומן נספח בלבד.

מדוע הבדל טקסט מציג כל שורה כפי שהשתנה כאשר הנתונים בקושי זזו? מכיוון ש-text diff משווה קבצים שורה אחר שורה ובסדר אם הייצוא ממוין מחדש, כמעט כל שורה נוחתת במיקום חדש וה-diff מסמן את כל הקובץ כשונה, למרות שהרשומות הבסיסיות זהות. CSV diff מנתח את הקובץ לשורות ועמודות ומשווה רשומות לפי מפתח, כך שלמיון מחדש אין השפעה ורק שינויים אמיתיים מדווחים.

האם זה מראה איזה תא ספציפי השתנה ברצף? כן. כאשר שורה מותאמת שונה, הכלי מפרט כל עמודה שהשתנתה לפי שם ומציג את הערך הקודם ליד הערך החדש. שורה שבה רק עמודת המצב עברה מתא פעיל לסגור מדווחת על תא בודד זה במקום לסמן את השורה כולה.

באילו תוחמים הוא תומך? פסיק, נקודה-פסיק, לשונית וצינור המפריד מזוהה אוטומטית מהקובץ הראשון על ידי בחירת המפריד שמייצר ספירת עמודות עקבית על פני מספר השורות הראשונות, ותוכל לעקוף אותו באופן ידני כאשר הזיהוי שגוי עבור הנתונים שלך.

מה קורה אם לעמודת המפתח שלי יש ערכים כפולים? הכלי מזהיר אותך שעמודת המפתח מכילה כפילויות ומשווה רק את השורה הראשונה עבור כל מפתח. מקשים כפולים פירושם בדרך כלל שהעמודה אינה מזהה ייחודי אמיתי, ולכן האזהרה היא הנחיה לבחור מפתח אחר או לנקות את הנתונים לפני אמון ב-diff.

האם קבצי ה-CSV שלי מועלים לכל מקום? מס 'כל הניתוח וההשוואה לרוץ באופן מקומי בדפדפן שלך עם JavaScript רגיל שום דבר לא מועבר, נרשם, או מאוחסן, ואתה יכול לאשר את זה בכרטיסייה הרשת שבו לא מופיעה בקשה הכלי גם ממשיך לעבוד במצב לא מקוון לאחר הדף נטען.

כמה גדול קובץ זה יכול להתמודד? התאמת מפתחות משתמשת במפות גיבוב ולא בלולאות מקוננות, כך שהיא מתרחבת באופן ליניארי בערך ומטפלת בעשרות אלפי שורות בנוחות. המגבלה המעשית היא שהדפדפן שלך מציג ערכת תוצאות גדולה מאוד, לא ההשוואה עצמה.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!