כיצד "לקלף" מעטפת מ JSON באמצעות .NET
-
שלום לכולם
אני מקבל קובץ JSON מתוכנה שמפענחת PDF התוכנה הזאת מחלקת כל דף לאובייקט נפרד, כך השג'ייסון מגיע כ2 אובייקטים או יותר. בנוסף לכך הטקסט מקונן בתוך האובייקט בעומק מסויים. כאשר אני רוצה לקחת את כל הטקסט, בעצם אני צריך לחלץ את האובייקט "text" מתוך כל אובייקט ואובייקט, ולעשות להם סוג של UNION ולאחר מכן יש בידי מערך ענק של כל הטקסט שיש בקובץ הPDF.איך אני עושה את זה באמצעות דוט נט האם מישהו יודע (אני משתמש כרגע במחלקה הזאת).
תודה.
פורסם במקור בפורום CODE613 ב24/11/2014 15:12 (+02:00)
-
תודה רבה
הפתרון ספציפית (לא גנרית!) הוא כזה, אני מעלה את הקוד אולי מישהו יהנה ממנו בעתיד:
(דוד לא להתעצבן על ה DATATABLE במחלקה הזאת זה עובד פיקס מעל למצופה! (ואנחנו נגד משטר בולשביקי בפורום ))
אתה מכניס קובץ PDF ומקבל DataTable עם כל הנתונים של הטקסט!using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PdfParser { class PdfSocialSecurity { private string _PdfFullName; private string JsonFile; //pdf2json.exe -enc UTF-8 lb.pdf lb.json void CreateJson() { JsonFile = Path.GetDirectoryName(_PdfFullName) + @"\" + Path.GetFileNameWithoutExtension(_PdfFullName) + ".json"; System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo(Path.Combine(Directory.GetCurrentDirectory(), "pdf2json.exe"), _PdfFullName + " -enc UTF-8 " + JsonFile); procStartInfo.RedirectStandardOutput = true; procStartInfo.UseShellExecute = false; procStartInfo.CreateNoWindow = true; System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.StartInfo = procStartInfo; proc.Start(); } string Jsonstr { get { return System.IO.File.ReadAllText(JsonFile).Replace("[]", @""""""); } } public DataTable JsonDataTable() { JArray j = JArray.Parse(Jsonstr); List<DataTable> tables = new List<DataTable>(); DataTable table; string Jtext; for (int i = 0; i < j.Count ; i++) { Jtext = j[i]["text"].ToString(); table = JsonConvert.DeserializeObject<DataTable>(Jtext); table.Columns.Add("Page", System.Type.GetType("System.Int32")); table.Columns.Add("Serial", System.Type.GetType("System.Int32")); table.Columns.Add("FileName"); int r = 1; foreach (DataRow row in table.Rows) { row["FileName"] = Path.GetFileName( _PdfFullName); row["Serial"] = r; row["Page"] = i + 1; r++; } tables.Add(table); } DataTable FinalTable = new DataTable (); foreach (DataTable tbl in tables) { FinalTable.Merge(tbl); } return FinalTable; } public PdfSocialSecurity(string PdfFullName) { _PdfFullName = PdfFullName; CreateJson(); } } }
פורסם במקור בפורום CODE613 ב25/11/2014 12:06 (+02:00)
-
ארכיטקט, היה עליך לכתוב "טוב, הסתדרתי" ולא להדביק קוד שכ"כ לא נאה לשמך (ניקך).
א. אם החלפת טקסט, אז יאללה regex ששולף, במקרה שלך:
var input = System.IO.File.ReadAllText("c:\\lb.json"); foreach (Match ma in Regex.Matches(input, "'data':'(.)'")) Console.Write (ma.Groups[1]);
ב. אם DataTable עם הוספה ידנית של מאפיינים (!!) אז למה לא אובייקטים ודסריאליזציה שלשם כך נוצר המחלקה ונושא המחלקה, ככה:
static void Main(string[] args) { var input = System.IO.File.ReadAllText("c:\\lb.json"); var pages = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Page>>(input); } class Page { public string number { get; set; } public string pages { get; set; } public string width { get; set; } public string height { get; set; } public subObjectForText[] text { get; set; } } class subObjectForText { public string data { get; set; } }
אני מקוה שאפי' שבמקום לעזור וזהו אני ככה צועק אתה תשמח משהו בחינת "פצעי אוהב".
פורסם במקור בפורום CODE613 ב25/11/2014 13:06 (+02:00)
-
@דוד ל.ט.
ארכיטקט, היה עליך לכתוב "טוב, הסתדרתי" ולא להדביק קוד שכ"כ לא נאה לשמך (ניקך).
"טוב הסתדרתי" זאת תשובה בסגנון נרקיסיסטי ואינה יאה לפורום הנושא את דגל ההדדיות, הפורום לא נועד להגדיל את שמו של אי מי, אלא לשיתוף ועזרה הדדית. כך שלא איכפת לי גם אם ישפילו אותי עד עפר, אני מוסר נפש בשביל כלל ישראל....
@דוד ל.ט.א. אם החלפת טקסט, אז יאללה regex ששולף
דוד דוד, כמה פעמים אמרתי לך לקרוא לפני שאתה עונה, אתה יכול לא לענות כלל, אבל אל תהי נבהל להשיב...
החלפה זו נועדה לתקן באג קטן שיש שם בפלט של התוכנה, ולא ע"מ לשלוף מידע. שים לב שאני מחליף "[]" ב "", זה בסך הכל משהו טפשי שתקע אותי שם.
וכבא כתבנו לעיל: @ארכיטקטפתרון ספציפית (לא גנרית!)
@דוד ל.ט.
אם DataTable עם הוספה ידנית של מאפיינים (!!) אז למה לא אובייקטים
אטו DataTables לאו אובייקטים נינהו??? אלא מאי, אובייקטים מוכנים שירשנו מאבותינו עדיפי, הואיל ואית בהו מאפייני טובא.
@דוד ל.ט.
אני מקוה שאפי' שבמקום לעזור וזהו אני ככה צועק אתה תשמח משהו בחינת "פצעי אוהב".
ניקך נאה לך ואתה נאה לניקך.
וכעת לעניין:
ברור שאם הייתי רוצה רק את הטקסט באופן רציף לא היה צריך את כל העניין הזה, אולם מפסידים הרבה מידע בדרך שלך (מידע שאני צריך באופן אישי, לא אמרתי שכל מי שרוצה טקסט מPDF רוצה) אני צריך לדעת את הסדר הכרונולוגי של הטקסט (העמודה Serial) באיזה עמוד נמצא המידע, וכן הלאה. מה שאתה מציע זה פשוט לשלוף את כל הדטה וזהו.
אסביר עוד סיבה למה זה לא רעיון טוב, כי הוא הופך את העברית, אבל את המספרים הוא לא הופך, וכשיש טבלה בתוך ה PDF (ואצלי יש טבלה ואני צריך רק את הנתונים שלה!!) אין רווח בין התאים בטבלה ואתה צריך להתסמך על המאפיין left בלבד. בקיצור שליטה מוחלטת על המסמך מתאפשרת הודות לגישה לכל המאפיינים שמסביב לכל אות (כאשר את page,serial וfileName הוספתי ידנית).אז לסיכום אני מסכים עם הקוד שלך בן 3 השורות, אולם לא במקרה הנוכחי.
ואגב שורה אחת כן תיקנתי בזכותך, תודה רבה.אגב ל PDF creator יש כנראה משתנים שאנחנו לא יודעים עליהם, כי הקובץ שמגיע מדף האינטרנט למדפסת PDF לא תמיד זהה במדוייק במבנה שלו (אני מדבר על שינויים של נקודה לכאן או לשם).
פורסם במקור בפורום CODE613 ב25/11/2014 13:36 (+02:00)
-
דבר ראשון לקוד שלך אין זכות קיום, גם לא במדינה קפיטליסטית ליברלית. בגלל השימוש המסורבל והמיותר בDataTable.
אני ודאי לא התכוונתי לומר שregex הוא פיתרון, זה היה רק קריאת תיגר על השימוש עם הReplace.תוכל להשתמש בשופי בקוד השני שהבאתי או בזה:
var input = System.IO.File.ReadAllText("c:\\lb.json"); var arr = JArray.Parse(input); var list = arr.Values("text").SelectMany(x => x.Select(y => new { text = y["data"].Value<string>() /* , עוד? בבקשה: xMoreProp = x["xxx"].Value<string>(), xMoreProp = x["xxx"].Value<string>(), xMoreProp = x["xxx"].Value<string>(), */ }));
רמזתי לך על כך באישי אבל אתה כנראה לא ראית.
DataTable הוא לא גרוע מאובייקט. רק דרך יצירתו במהלך ריצת הקוד עם הוספת המאפיינים, וגם עצם הדבקות בדבר ש"עובד", במקום במה ש"צריך" (דרך המלך או לפי הספר ושלל הכינויים) היא זו שמפרה את שיווי משקלי..
בהצלחה.פורסם במקור בפורום CODE613 ב25/11/2014 13:54 (+02:00)