سؤال

لدي تطبيق بسيط يفتح ملفًا نصيًا محددًا بعلامات جدولة، ويدرج تلك البيانات في قاعدة بيانات.

أنا أستخدم قارئ CSV هذا لقراءة البيانات: http://www.codeproject.com/KB/database/CsvReader.aspx

وكل شيء يعمل على ما يرام!

الآن أضاف عميلي حقلاً جديدًا إلى نهاية الملف، وهو "ClaimDescription"، وفي بعض أوصاف هذه المطالبة، تحتوي البيانات على علامات اقتباس، على سبيل المثال:

"SUMISEI MARU NO 2" - بحر اليابان

يبدو أن هذا يسبب صداعًا كبيرًا لتطبيقي.أحصل على استثناء يبدو كالتالي:

يبدو أن ملف CSV تالف بالقرب من حقل السجل "1470" "26" في الموضع "181".البيانات الأولية الحالية:...

وفي تلك "البيانات الأولية"، من المؤكد أن حقل وصف المطالبة يعرض البيانات مع علامات الاقتباس فيها.

أريد أن أعرف هل أحد واجه هذه المشكلة من قبل وتم التغلب عليها؟من الواضح أنه يمكنني أن أطلب من العميل تغيير البيانات التي أرسلها إليّ في الأصل، ولكن هذه عملية تلقائية يستخدمونها لإنشاء الملف المحدد بعلامات جدولة؛وأفضل استخدام ذلك كملاذ أخير.

كنت أفكر أنه ربما يمكنني فتح الملف باستخدام TextReader القياسي مسبقًا، والتخلص من أي علامات اقتباس، وكتابة المحتوى مرة أخرى في ملف جديد، ثم إدخال هذا الملف في قارئ CSV.ربما تجدر الإشارة إلى أن متوسط ​​حجم الملف لهذه الملفات المحددة بعلامات جدولة يبلغ حوالي 40 ميجابايت.

أي مساعدة يحظى بتقدير كبير!

في صحتك، شون

هل كانت مفيدة؟

المحلول 7

حسنًا - بعد قضاء وقت متأخر من الليل في ريد بول وحيرة في رأسي، وجدت المشكلة أخيرًا، وكانت عبارة عن فواصل في حقل "وصف_المطالبة".لم أفكر في ذلك حتى لأنني كنت أستخدم ملفًا محددًا بعلامات جدولة، ولكن بمجرد أن قمت بالبحث والاستبدال على جميع الفواصل في الملف، كان الأمر جيدًا تمامًا!

والخطوة التالية هي معرفة كيفية استبدال تلك الفواصل قبل المعالجة.

مرة أخرى، شكرا لجميع الاقتراحات.

في صحتك، شون

نصائح أخرى

تحقق من التعليق على مقالة codeproject حول عروض الأسعار:

http://www.codeproject.com/Messages/3382857/Re-Quotes-inside-of-the-Field.aspx

يجب أن تحدد في المُنشئ أنك تريد استخدام حرف آخر إلى جانب "" كعلامات اقتباس.

استخدم ال FileHelpers المكتبة بدلا من ذلك.يتم استخدامه على نطاق واسع وسوف يتعامل مع الحقول المقتبسة، أو الحقول التي تحتوي على علامات اقتباس.

لقد قمت مؤخرًا بحل مشكلة مماثلة، وعلى الرغم من أن CsvReader كان يعمل بشكل صحيح على جميع أسطر ملف TSV الخاص بي باستثناء بضعة أسطر، إلا أن ما حل مشكلتي في النهاية هو تعيين customDelimiter في منشئ CsvReader

public static void ParseTSV(string filepath)
    {
        using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t')) {
        //if that didn't work, passing unlikely characters into the other params might help
        //using (CsvReader csvReader = new CsvReader(new StreamReader(filepath), true, '\t', '~', '`', '~', ValueTrimmingOptions.None)) {
            int fieldcount = csvReader.FieldCount;

            //Does not work, since it's read only property
            //csvReader.Delimiter = "\t";

            string[] headers = csvReader.GetFieldHeaders();

            while (csvReader.ReadNextRecord()) {
                for (int i = 0; i < fieldcount; i++) {
                    string msg = String.Format("{0}\r{1};", headers[i],
                                               csvReader[i]);
                    Console.Write(msg);
                }
                Console.WriteLine();
            }
        }
    }

ربما يمكنك فتح الملف باستخدام تطبيقك واستبدال كل اقتباس بحرف آخر ثم معالجته.

لقد أجريت بعض البحث، ويوجد RFC لملفات CSV (آر إف سي 4180)، وهذا يحرم صراحة ما يفعلونه:

قد يتم أو لا يتم إرفاق كل حقل في عروض أسعار مزدوجة (ومع ذلك بعض البرامج ، مثل Microsoft Excel ، لا تستخدم عروض أسعار مزدوجة على الإطلاق).إذا لم تكن الحقول مغلقة مع عروض أسعار مزدوجة ، فقد لا تظهر عروض الأسعار المزدوجة داخل الحقول.

في الأساس، إذا أرادوا القيام بذلك، فيجب عليهم تضمين هذا الحقل بأكمله بين علامتي اقتباس، كما يلي:

,""SUMISEI MARU NO 2" - sea of Japan",

لذا، إذا أردت، يمكنك إعادة هذه المشكلة إليهم والإصرار على إرسال ملف RFC 4180 CSV "مناسب" إليك.

نظرًا لأنه يمكنك الوصول إلى الملفات المصدر لقارئ CSV هذا، فإن هناك خيارًا آخر يتمثل في تعديله للتعامل مع نوع السلاسل المقتبسة التي يغذيها لك.

هذا النوع من المواقف هو بالضبط سبب أهمية الوصول إلى كود المصدر إلى مجموعة الأدوات الخاصة بك.

إذا كنت تريد بدلاً من ذلك معالجة (اختراق) ملفاتهم مسبقًا قبل تحميلها على أداتك، فإن الطريقة الصحيحة هي البحث عن الحقول التي لا تحتوي على علامة اقتباس مباشرة أمام الفاصل أو خلفه، وإحاطة الحقل بالكامل في مجموعة أخرى من الاقتباسات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top