כיצד להסיר שורה מקובץ

תוכן עניינים:

כיצד להסיר שורה מקובץ
כיצד להסיר שורה מקובץ

וִידֵאוֹ: כיצד להסיר שורה מקובץ

וִידֵאוֹ: כיצד להסיר שורה מקובץ
וִידֵאוֹ: כיצד להוריד ולהתקין ווינדוס 10 Windows במחשב באמצעות דיסק און קי 2024, מאי
Anonim

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

PHP: כיצד להסיר שורה מקובץ
PHP: כיצד להסיר שורה מקובץ

נחוץ

ידע בסיסי ב- PHP

הוראות

שלב 1

נתונים ראשוניים:

- יש לנו קובץ טקסט allStrings.txt, המכיל מספר שורות נתונים

- נדרש למחוק את השורה מספר 44 מהקובץ

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

שלב 2

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

$ lineToKill = 44; ואז נקרא את הקובץ במערך של מחרוזות: $ stringsArray = file ($ fileName); בואו לבדוק אם הקובץ מכיל את השורה שאנחנו צריכים. כל הקוד הנוסף יבוצע רק אם התנאי $ lineToKill אינו גדול ממספר השורות במערך $ stringsArray: אם ($ lineToKill <= count ($ stringsArray)) {

// זה יהיה הלולאה הראשית של התוכנית

} אם התנאי לא מתקיים, אין לנו מה למחוק. תן לתסריט להדפיס הודעת מידע על כך: אחרת מהדהד "מספר השורות בקובץ קטן מ-". $ LineToKill. "!"; אם התנאי מתקיים, עליך למחוק את קובץ המקור לערך חדש: $ fileHandle = fopen ($ fileName, "w"); כעת עלינו לארגן לולאה שמתנגנת על כל האלמנטים של מערך המיתרים. אך מכיוון שמערכת האינדקס מתחילה מאפס, וספרנו את מספר השורה למחיקה מאחד, אז עוד לפני תחילת הלולאה נפחית את הערך של $ lineToKill אחד, כדי לא לחזור על פעולה זו בכל שלב: $ lineToKill -; כדי לארגן לולאה: foreach ($ stringsArray כמפתח $ => $ value) {

// הנה הקוד של כל שלב בלולאה

} משתנה המפתח $ יכיל את אינדקס השורה הנוכחית במערך, והמשתנה $ value יכיל את הערך של שורה זו. בכל שלב של הלולאה נשווה את אינדקס השורה במערך למספר שיימחק, ואם הם לא תואמים, נכתוב את הערך של שורה זו לקובץ: אם (מקש $! = $ LineToKill) fwrite ($ fileHandle, $ $); אם אם הם תואמים, לא נכתוב לקובץ, אלא נדפיס הודעה על מחיקה מוצלחת: אחרת מהדהד "Line". $ LineToKill. "נמחק."; וגם בסוף המחזור, לאחר סיום הכתיבה לקובץ, עליך לסגור אותו בנימוס: fclose ($ fileHandle);

שלב 3

הקוד השלם ייראה כך: <? Php $ fileName = "allStrings.txt";

$ lineToKill = 44; $ stringsArray = file ($ fileName);

אם ($ lineToKill <= count ($ stringsArray)) {

$ fileHandle = fopen ($ fileName, "w");

$ lineToKill--;

foreach ($ stringsArray כ- $ key => $ value) {

אם ($ key! = $ lineToKill) fwrite ($ fileHandle, $ value);

אחר מהדהד "קו". $ lineToKill. "נמחק.";

}

fclose ($ fileHandle);

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

שלב 4

סקריפט זה יתחיל באותו אופן כמו הקודם:

$ fileName = "allStrings.txt";

$ lineToKill = 44;

אז אתה צריך ליצור קובץ זמני לעבודה. בוא נעשה את זה בתיקיה "tmp" וניתן את אותה קידומת לקובץ הזמני: $ tempFile = tempnam ("/ tmp", "tmp"); בוא ננסה לפתוח את קובץ המקור לקריאה: if ($ fileHandle = @fopen ($ fileName, "rb")) {

// קוד זה יבוצע במקרה של פתיחה רגילה של קובץ המקור

} אם זה נכשל - עבודה נוספת של הסקריפט אינה הגיונית, אנו הורגים את התהליך עם הנפקת ההודעה המתאימה: אחרת מתים ("קובץ המקור לא קיים!"); אם הקובץ נפתח כרגיל, אז אנחנו ידפיס הודעה על כך וינסה לפתוח את הקובץ הזמני שנוצר בעבר עם הודעה מתאימה: הד "קובץ המקור קיים";

אם ($ tempHandle = fopen ($ tempFile, "w")) מהדהד "נוצר קובץ זמני."; עכשיו הגיע הזמן להתחיל לולאה של שורות קריאה מקובץ המקור, שיימשך עד שהוא יגיע בסוף הקובץ: while (! feof ($ fileHandle)) {

// כאן יהיה הקוד לעבודה עם השורה הנוכחית

} בכל שלב של הלולאה נקרא שורה אחת: $ lineToWrite = fgets ($ fileHandle); ואם זו לא השורה למחיקה, אז כתוב אותה לקובץ זמני. מונה השורה $ lineNum יוגדל ישירות בפעולת ההשוואה: אם ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); כאשר נגמרו השורות, סגור את הקובץ: fclose ($ fileHandle);

fclose ($ tempHandle); לבסוף, שנה את שם קובץ ה- temp לקובץ המקורי. אם פעולה זו מצליחה, ננפיק הודעה מתאימה: אם (שם ($ tempFile, $ fileName)) מהדהד "השורה $ lineToKill נמחקה";

שלב 5

קוד מלא:

<? php $ fileName = "allStrings.txt";

$ lineToKill = 44; $ tempFile = tempnam ("/ tmp", "tmp");

אם ($ fileHandle = @fopen ($ fileName, "rb")) {

הד "קובץ המקור קיים";

אם ($ tempHandle = fopen ($ tempFile, "w")) מהדהד "נוצר קובץ זמני.";

}

אחרת למות ("קובץ המקור אינו קיים!"); בעוד (! feof ($ fileHandle)) {

$ lineToWrite = fgets ($ fileHandle);

אם ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);

} fclose ($ fileHandle);

fclose ($ tempHandle);

אם (שנה שם ($ tempFile, $ fileName)) מהדהד "קו $ lineToKill הוסר";?>

מוּמלָץ: