פתרון לבאג של הקראת "ביוני" בקריין החדש
-
תגובה: קול ההקראה השתנה לפתע
@זאביק כתב בקול ההקראה השתנה לפתע:
אסביר בצורה מפורטת יותר, איזו תקלה עומדת להיות בעקבות הקריין החדש בחודש הבא:
יש לי קובץ בדטה בייס, עם תאריכים לועזיים בצורה של ספרות בלבד,
ויש לי קוד ששואב את הנתונים דרך API ומקריא את התאריכים ללקוחות שלי במערכת הטלפונית,וכעת שמתי לב, שאת התאריך 14 ביוני 2025 למשל, הוא מקריא לי בטלפון כך (שימו לב לניקוד):
14 בִּיוֵנֵי 2025
וכעת הלקוחות שלי שומעים בטלפון "בִּיוֵנֵי" , ולא מבינים מה הקריין בדיוק אומר,@אביי-ורבא כתב בקול ההקראה השתנה לפתע:
רג'קס להחלפה של כל המופעים של המילה "יוני"/"ביוני" בסטרינג שאתה מחזיר לימות למילה המנוקדת כראוי,
סתם ככה כדאי לך להעביר בפונקציה מסויימת כל סטרינג שאתה שולח לימות בחזרה, ובפונקציה הזו תוכל להטמיע כל מיני החלפות והסרת תווים לא רצויים, רווחים מיותרים וכדו'@אביי-ורבא כתב בקול ההקראה השתנה לפתע:
אולי כדאי שתפתח נושא חדש עם בלוק הקוד הרלוונטי, ואשתדל לעזור לך,
@אביי-ורבא חודש טוב,
אשמח אם תוכל בבקשה להדריך אותי, איזה שורות בדיוק (כלומר: איזה פקודות בדיוק) עלי להוסיף בקוד שלי, בכדי שיחליף אוטומטי מ"ביוני" ל"בְּיוּנִי", (את שאר החודשים כמדומני שהוא מקריין נכון),
להלן ציטוט מהקוד שלי לגבי העניין הרלוונטי:
//date to string const date = new Date(result.evictionDate); const optionsDate = { year: 'numeric', month: 'long', day: 'numeric' }; ********* { type: "text", data: "בתאריך" }, { type: "text", data: date.toLocaleDateString("iw-IL", optionsDate) },
יתכן שהקוד אצלי נבנה מלכתחילה עם פונקציית TEXT ולא עם פונקציית DATE בגלל שהתאריך מופיע אצלי בדטה בייס בתבנית 2025/06/14 ואילו בפונקציית DATE צריך לשלוח לימות בתבנית 14/06/2025ואם אכן זו הסיבה לכך, אז היה אפשר להכניס פקודה להפוך ולסדר את התבנית של התאריך לפני השליחה לימות, - ואז הקריינות של הDATE, הייתה קריינות נורמלית בלי צורך לתיקונים נוספים,
אבל כיון שהבאג הזה קיים אצלי בהרבה קבצים של קודים שונים ונפרדים, כמדומה שיותר פשוט להשתמש עם העיצה הפשוטה שלך, מאשר להתחיל להסתבך עם באגים אחרים שעלולים לצוץ לי בכל קוד וקוד בפני עצמו.
תודה רבה!!!
-
@זאביק
סליחה שאני מתערב אבל למה לא להשתמש בפונקצייה של תאריך מובנה בAPI בשביל זה?
-
@מ-מ-פליישער תסתכל בספוילר שכתבתי שם,
תודה רבה!! -
@זאביק כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
@מ-מ-פליישער תסתכל בספוילר שכתבתי שם,
תודה רבה!!זה JS? אם ככה פיתרון הכי פשוט:
let date = "2025/06/14"; let yemotDate = date.split("/").reverse();
התוצאה שהוא פשוט מפריד עם הלוכסן ועושה רוורס
-
@מ-מ-פליישער יש לי את כל סוגי התאריכים, ולאו דווקא 14 ביוני
-
@זאביק כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
@מ-מ-פליישער יש לי את כל סוגי התאריכים, ולאו דווקא 14 ביוני
ברוררר זה סתם דוגמא כי אתה כתבת את זה.
רגע שאבין. יש לך נתון מהמסד נתונים. כמו תא קולי. נתון משתנה. לולאה וודעבר שזה יהיה.
וזה בפורמט שרשמת וימות זה הפוך.let dbDate = ...
מה שהבאתי פשוט הופך ומתאים אותו לימות. בעיקרון אפשרי לעשות גם עם הספרייה של moment בנוד אבל כאן זה הפיתרון הכי פשוט. בתקווה שזה באמת לא אמור להשתנות. פשוט אתה לוקח את הסטרינג של התאריך ועושה "רוורס" כדי שיותאם לימות. קלי קלות.
מקווה שהובנתי.
-
@מ-מ-פליישער כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
@זאביק כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
@מ-מ-פליישער יש לי את כל סוגי התאריכים, ולאו דווקא 14 ביוני
ברוררר זה סתם דוגמא כי אתה כתבת את זה.
רגע שאבין. יש לך נתון מהמסד נתונים. כמו תא קולי. נתון משתנה. לולאה וודעבר שזה יהיה.
וזה בפורמט שרשמת וימות זה הפוך.let dbDate = ...
מה שהבאתי פשוט הופך ומתאים אותו לימות. בעיקרון אפשרי לעשות גם עם הספרייה של moment בנוד אבל כאן זה הפיתרון הכי פשוט. בתקווה שזה באמת לא אמור להשתנות. פשוט אתה לוקח את הסטרינג של התאריך ועושה "רוורס" כדי שיותאם לימות. קלי קלות.
מקווה שהובנתי.
נגיד
let date = "2025/05/27";
let date1 = "2125/05/27";
date.split("/").reverse()
ואותו דבר גם על השני. בקיצור מה שהבאתי תעשה עליו טסט -
למעשה הקוד שלי כעת נראה כך (כלומר הקטע הרלוונטי מתוך קוד ארוך מאוד):
//date to string const date = new Date(result.evictionDate); const optionsDate = { year: 'numeric', month: 'long', day: 'numeric' }; { type: "text", data: "בתאריך" }, { type: "text", data: date.toLocaleDateString("iw-IL", optionsDate) },
ואודה לך מאוד, אם תוכל להראות לי כיצד להכניס לתוך הקוד בצורה מדוייקת את הקוד של הרוורס, ומה עוד צריך לשנות בקוד המקורי (חוץ מהשינוי של TEXT ל DATE) בשביל שיהיה תקין עם הקוד של הרוורס,
תודה רבה!!!
-
@זאביק כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
date.toLocaleDateString("iw-IL", optionsDate)
קודם כל אולי כדאי לאמת שהסטרינג אכן מכיל את המילה "ביוני"
תוסיף קונסול לוג לערך שלdate.toLocaleDateString("iw-IL", optionsDate)
למעשה, אני מצרף קוד מלא עבור nodejs שכתבתי לאחת האפליקציות שלי, ככה זה יעבוד לך לא רק על "ביוני", אלא על רשימה שתוכל לעדכן בקלות,
בהפעלה של האפליקציה נטענת רשימת מילים מקובץ
dictionary.csv
שנראה ככה:תּוֹדָה,תודה אַחֵר,אחר יַעֲקֹב לַנְדֳּא,יעקב לנדא
(המבנה פשוט - הערך החדש, הערך הקיים שאנחנו רוצים להחליף)
כעת צריך ליצור קובץ
dictionary.js
שהוא בעצם מכיל את כל הקוד הדרוש, פונקציה לטעינה של הערכים מהcsv, פונקציה לרענון מחדש של הרשימה, ופונקצייתreplaceTextDictionary
שמבצעת את ההחלפה עצמה,import { readFileSync } from 'fs'; import { join } from 'path'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; // Get the directory name of the current module const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); // Map to store the dictionary data let dictionaryMap = new Map(); /** * Loads dictionary data from CSV file into a map * @returns {Map} The dictionary map */ function loadDictionary() { try { // Read the CSV file const csvPath = join(__dirname, 'dictionary.csv'); const csvData = readFileSync(csvPath, 'utf8'); // Split the CSV data into rows const rows = csvData.split('\n'); // Process each row rows.forEach(row => { if (!row.trim()) return; // Skip empty rows // Split the row into columns const columns = row.split(','); if (columns.length < 2) return; // Skip rows with insufficient data // The first column is the value const value = columns[0].trim(); // The remaining columns are keys for (let i = 1; i < columns.length; i++) { const key = columns[i].trim(); if (key) { dictionaryMap.set(key, value); } } }); return dictionaryMap; } catch (error) { console.error('Error loading dictionary:', error); return new Map(); } } /** * Replaces text based on the dictionary map * @param {string} text - The text to process * @returns {string} - The processed text with replacements */ function replaceTextDictionary(text) { if (!text) return text; // Ensure the dictionary is loaded if (dictionaryMap.size === 0) { loadDictionary(); } // Sort keys by length in descending order to handle longer matches first // This is crucial for cases where one key is a substring of another // For example, "לאלתר ספרים" should be checked before "אלתר" const sortedKeys = Array.from(dictionaryMap.keys()).sort((a, b) => b.length - a.length); let result = text; // Process each key in the dictionary for (const key of sortedKeys) { // For Hebrew text, we need a different approach than word boundaries // We'll use a regex that matches the key surrounded by word boundaries or space/punctuation const pattern = `(^|\\s|[\\p{P}])(${escapeRegExp(key)})($|\\s|[\\p{P}])`; const regex = new RegExp(pattern, 'gu'); // Replace while preserving the surrounding characters result = result.replace(regex, (match, before, word, after) => { return `${before}${dictionaryMap.get(key)}${after}`; }); } return result; } /** * Escapes special characters in a string for use in a regular expression * @param {string} string - The string to escape * @returns {string} - The escaped string */ function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[]\]/g, '\\$&'); } // Load the dictionary when the module is imported loadDictionary(); // Export functions export { loadDictionary, replaceTextDictionary }; export const getDictionaryMap = () => dictionaryMap;
והשימוש בפועל פשוט,
לייבא את הפונקציה, ולשלוח את הסטרינג לטיפול,import { replaceTextDictionary } from './dictionary.js'; //date to string const date = new Date(result.evictionDate); const optionsDate = { year: 'numeric', month: 'long', day: 'numeric' }; { type: "text", data: "בתאריך" }, { type: "text", data: replaceTextDictionary(date.toLocaleDateString("iw-IL", optionsDate)) },
ואגב, לגוף ההצעה של @מ-מ-פליישער אתה יכול לקבל את התאריך בפורמט של dd/MM/YYYY ישירות באמצעות שינוי של הoptionsDateconst optionsDate = { year: 'numeric', month: '2-digit', day: '2-digit' };
-
@זאביק כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
למעשה הקוד שלי כעת נראה כך (כלומר הקטע הרלוונטי מתוך קוד ארוך מאוד):
//date to string const date = new Date(result.evictionDate); const optionsDate = { year: 'numeric', month: 'long', day: 'numeric' }; { type: "text", data: "בתאריך" }, { type: "text", data: date.toLocaleDateString("iw-IL", optionsDate) },
ואודה לך מאוד, אם תוכל להראות לי כיצד להכניס לתוך הקוד בצורה מדוייקת את הקוד של הרוורס, ומה עוד צריך לשנות בקוד המקורי (חוץ מהשינוי של TEXT ל DATE) בשביל שיהיה תקין עם הקוד של הרוורס,
תודה רבה!!!
לא צריך את ההיפוך, מספיק לשנות את optionsDate,
const optionsDate = { year: 'numeric', month: '2-digit', day: '2-digit' };
-
@אביי-ורבא כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
לא צריך את ההיפוך, מספיק לשנות את optionsDate,
ניסיתי לשנות כפי שכתבת בהודעה האחרונה, ולא היה תקין, (לא בפונקציית TEXT ולא ב DATE)
-
@זאביק מה לא היה תקין?
תצרף הדפסה של הערך לפני ואחרי -
@אביי-ורבא אינני מתכנת (ואיני יודע להדפיס את הערך), אבל למעשה כשביצעתי את השינוי בקוד כנ"ל, והתקשרתי שוב למערכת, - ראיתי שבמיקום הספציפי של הקראת התאריך הנ"ל, השתרר שקט ארוך למשך זמן רב.
-
@זאביק תוסיף אחרי 2 השורות הראשונות בדוגמה שהבאת
console.log(date) console.log(optionsDate)
ותעלה לכאן את הפלט שתראה בקונסול (כמובן אחרי שתחייג למערכת ותגיע למקום שהוא אמור להקריא את זה)
-
@אביי-ורבא כתב בפתרון לבאג של הקראת "ביוני" בקריין החדש:
ותעלה לכאן את הפלט שתראה בקונסול
גם את זה עדיין אינני יודע כיצד לבצע...