כיצד לטפל בקובץ csv באמצעות php?
במדריך קודם למדנו כיצד להעלות קבצים לשרת , ובמדריך זה נסביר כיצד PHP יכול לטפל בקבצי CSV. אם תדעו כיצד לטפל בקבצי CSV תוכלו, לדוגמה, להעלות קבצי excel שלמים למסד הנתונים, ולהשתמש בהם בדרכים הרבות והשונות שמאפשר PHP.
במדריך זה נלמד:
- להסב קבצי Excel לקבציי CSV
- לטפל בקבצי CSV באמצעות PHP
מבוסס על מדריך שפרסמתי באתר phpenthusiast.com, Parse CSV files with PHP
הסבת קבצי Excel לקבציי CSV
לצורך הדוגמה, נתחיל מקובץ excel רגיל שכולל את שמם של ראשי הרשויות בישראל במספר ערים נבחרות. הקובץ כולל את שמו של האזור (צפון, מרכז, דרום), את שם הרשות (חיפה, תל אביב, ירושלים) ואת שם ראש הראשות (יונה יהב, רון חולדאי, ניר ברקת וכיו"ב).
כך נראה קובץ האקסל המקורי:
כדי להסב את המסמך ל-CSV, נשמור את הקובץ בשם:
ונבחר בסוג CSV(Comma delimited):
התוצאה היא קובץ CSV, כשהשדות בכל שורה מופרדים עכשיו בפסיקים. כך זה נראה בעורך טקסט דוגמת notepad++:
שימו לב שאם הקובץ בעברית מוטב לשמור אותו בקידוד UTF-8, כדי שלא יתחרבש בעיבוד בהמשך.
אתם מוזמנים להוריד את קובץ ה-csv הבא כדי שישמש אתכם בהמשך המדריך.
טיפול בקבצי CSV באמצעות PHP
הפונקציה שמטפלת בקובץ ה-csv, היא fgetcsv, שזה התחביר שלה:
fgetcsv("file_name", 1000, "," );
- file_name – הוא שם הקובץ. לדוגמה, regions.csv
- 1000 – מספר התווים בשורה הארוכה ביותר (לא הכרחי)
- "," – התו המפריד בין הפריטים (לא הכרחי)
כדי להשתמש ב-fgetcsv ביעילות צריך לשלב קוד שלמדנו שפותח את הקובץ בתחילת הקוד באמצעות fopen, וסוגר את הקובץ בסוף הקוד באמצעות fclose. כשבין לבין, רצה לולאה שהופכת כל שורה בנפרד למערך.
זה הקוד:
פתיחת הקובץ לקריאה באמצעות fopen(), כמו שראינו במדריך טיפול בקבצים.
$handle = fopen("filename.csv", "r");
קריאת שורה-שורה מהקובץ באמצעות fgetcsv(), והפיכת כל שורה בנפרד למערך ($data).
fgetcsv($handle, 1000, ",");
כולל את ה-$handle, שיצרנו בסעיף קודם, 1000 מייצג את מספר התווים המקסימלי בכל שדה בנפרד, ו-"," מציין שהשדות מופרדים בפסיקים.
כדי שהקריאה תתבצע מכל השורות, צריך להריץ בתוך לולאה.
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// Do something.
}
סגירת הקובץ הפתוח.
fclose($handle);
בואו נשלב את שלושת השלבים, לקוד מלא:
<?php
// פתיחת הקובץ
if (($handle = fopen("mayors.csv", "r")) !== FALSE) {
// הפיכת כל שורה בנפרד למערך, כשהפריטים מופרדים בפסיק
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// Do something.
}
// סגירת הקובץ
fclose($handle);
}
הפיכת קובץ ה-CSV למערך מקונן
מטרת הקוד הבא לייצר מערך מקונן ($the_big_array), שהמערכים שמקוננים בתוכו עשויים כל אחד מאחת השורות בקובץ ה-CSV.
<?php
// שם הקובץ
$filename = 'mayors.csv';
// המערך שכולל את כל המערכים
$the_big_array = array();
// פותח את הקובץ וקורא את תכולתו
if (($handle = fopen("{$filename}", "r")) !== FALSE) {
//כל שורה בקובץ הופכת למערך $data
// פריטי המערך מופרדים בפסיק
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// כל מערך בנפרד נוסף למערך הגדול
$the_big_array[] = $data;
}
// סוגרים את הקובץ
fclose($handle);
}
// כותבים את המערך למסך
echo "<pre>";
print_r($the_big_array);
echo "</pre>";
וכך נראה המערך שיצרנו מקובץ ה-CSV:
Array
(
[0] => Array
(
[0] => איזור
[1] => שם היישוב
[2] => ראש היישוב
)
[1] => Array
(
[0] => מרכז
[1] => תל אביב
[2] => רון חולדאי
)
[2] => Array
(
[0] => מרכז
[1] => בת ים
[2] => שלמה לחיאני
)
[3] => Array
(
[0] => מרכז
[1] => חולון
[2] => מוטי ששון
)
[4] => Array
(
[0] => ירושלים
[1] => ירושלים
[2] => ניר ברקת
)
[5] => Array
(
[0] => צפון
[1] => חיפה
[2] => יונה יהב
)
[6] => Array
(
[0] => דרום
[1] => באר שבע
[2] => ראובן דנילוביץ
)
)
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
אמיר סימן טוב בתאריך: 20.10.2013
פוסט מפורט ומודגם נפלא! תודה יוסי!
מתן בתאריך: 12.01.2017
תודה על המדריך המפורט.
עשיתי את כל מה שאמרת ועדיין העברית יוצאת לי מחורבשת. מה עושים?
יוסי בן הרוש בתאריך: 12.01.2017
שלום, מתן.
קודם כל הייתי בודק שהקידוד הוא utf-8.
אם למרות הכול עדיין לא עובד,
אז כדאי להשתמש בספריות קוד ותיקות
ויציבות דוגמת PHP-EXCEL, ודומיו.
נתן בתאריך: 20.01.2017
האם יש דרך לעבוד עם קבצי אקסל ישירות במקום עם csv?
יוסי בן הרוש בתאריך: 20.01.2017
בשביל אקסל צריך להעזר בספריות
קוד דוגמת PHP-excel,
וראיתי עוד כמה פרויקטים מהסוג הזה.
באופן כללי, מטרת המדריכים היא
להסביר את עקרונות העבודה עם PHP
באמצעות המקרים הפשוטים ביותר,
ואם רוצים פתרון בוגר ויציב,
שמתאים ליותר מקרים,
אז הייתי ממליץ להשתמש בספריות קוד.
אאד בתאריך: 20.08.2018
פוסט נפלא! לי יש קובץ אקסל שאני רוצה להפוך כל שורה לקובץ נפרד עם סיומת tts איך עושים את זה? תודה רבה!