תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

כיצד לטפל בקובץ csv באמצעות php?

מחבר:
בתאריך:

במדריך קודם למדנו כיצד להעלות קבצים לשרת , ובמדריך זה נסביר כיצד PHP יכול לטפל בקבצי CSV. אם תדעו כיצד לטפל בקבצי CSV תוכלו, לדוגמה, להעלות קבצי excel שלמים למסד הנתונים, ולהשתמש בהם בדרכים הרבות והשונות שמאפשר PHP.

במדריך זה נלמד:

  1. להסב קבצי Excel לקבציי CSV
  2. לטפל בקבצי CSV באמצעות PHP

מבוסס על מדריך שפרסמתי באתר phpenthusiast.com, Parse CSV files with PHP

 

הסבת קבצי Excel לקבציי CSV

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

כך נראה קובץ האקסל המקורי:

מראה קובץ האקסל מבפנים

כדי להסב את המסמך ל-CSV, נשמור את הקובץ בשם:

כיצד לשמור קובץ excel כקובץ csv

ונבחר בסוג CSV(Comma delimited):

שמירה כסוג csv

התוצאה היא קובץ CSV, כשהשדות בכל שורה מופרדים עכשיו בפסיקים. כך זה נראה בעורך טקסט דוגמת notepad++:

מראה קובץ csv לדוגמה

 

נתקלתם בבעיה ואין לכם גישה לאקסל? לא נורא. אפשר להעלות את הקובץ ל-Google Drive ואז להוריד אותו כקובץ csv:

המרת קובץ ל-csv תקני באמצעות הגוגל דרייב

 

שימו לב שאם הקובץ בעברית מוטב לשמור אותו בקידוד 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] => ראובן דנילוביץ
    )
 
)

 

לכל מדריכי ה-PHP

 

 

אהבתם? לא אהבתם? דרגו!

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 איך עושים את זה? תודה רבה!

תמונת המגיב

shimspot בתאריך: 01.09.2021

יפה מאד בדקתי זה גם עובד