سؤال

أحاول استيراد ملف محدد علامة التبويب إلى جدول.

المشكلة هي أنه في بعض الأحيان، سيتضمن الملف سجل محرج يحتوي على اثنين من "قيم فارغة" ويسبب برنامجي لرمي "نهاية غير متوقعة".

على سبيل المثال، سيكون لكل سجل 20 حقلا. ولكن السجل الأخير سيكون له حقلين فقط (قيمتين فارغة)، وبالتالي، eof غير متوقع.

حاليا أنا أستخدم StreamReader.

لقد حاولت حساب الخطوط وإخبار BCP بالتوقف عن القراءة قبل "Nulls Phantom"، لكن StreamReader الحصول على عدد غير صحيح من الخطوط بسبب "nulls الفانتوم".

لقد جربت التعليمة البرمجية التالية للتخلص من جميع كود Bogus (الرمز المقترض من الشبكة). لكنه يستبدل فقط الحقول بمساحات فارغة (أود نتيجة لا يوجد أي خط خلفه).

Public Sub RemoveBlankRowsFromCVSFile2(ByVal filepath As String)
    If filepath = DBNull.Value.ToString() Or filepath.Length = 0 Then Throw New ArgumentNullException("filepath")

    If (File.Exists(filepath) = False) Then Throw New FileNotFoundException("Could not find CSV file.", filepath)


    Dim tempFile As String = Path.GetTempFileName()

    Using reader As New StreamReader(filepath)
        Using writer As New StreamWriter(tempFile)
            Dim line As String = Nothing
            line = reader.ReadLine()
            While Not line Is Nothing

                If Not line.Equals(" ") Then writer.WriteLine(line)

                line = reader.ReadLine()
            End While
        End Using
    End Using


    File.Delete(filepath)
    File.Move(tempFile, filepath)
End Sub

لقد حاولت استخدام SSIS، لكنها تواجه خطأ EOF غير متوقع.

ما الخطأ الذي افعله؟

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

المحلول 5

تم حل هذا باستخدام مجموعة بعض الشيء، والتحقق من بت واحد في وقت واحد للمشتبه به.

نصائح أخرى

إذا قرأت الملف بأكمله إلى متغير سلسلة (باستخدام القارئ.ريدتوينند ()) هل تحصل على كل شيء؟ أم أنك مجرد الحصول على البيانات حتى تلك الفانتوم Nulls؟

هل حاولت استخدام الدالة Reader.Readblock () لمحاولة قراءة طول الملف؟

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

طريقة واحدة لتجنب الخطأ هي استخدام ReadAlllines، ثم قم بمعالجة مجموعة أسطر الملفات بدلا من التقدم عبر الملف. هذا هو أيضا أكثر كفاءة بكثير من streamreader.

Dim fileLines() As String
fileLines = File.ReadAllLines("c:\tmp.csv")
...
for each line in filelines
  If trim(line) <> "" Then writer.WriteLine(line)
next line

يمكنك أيضا استخدام "حفظ خطوط الإخراج" في نفس الصورة أو صفيف سلسلة مختلفة واستخدام الملفات .WRITEALINELINE لكتابة الملف مرة واحدة.

يمكنك تجربة كائن .NET المدمج لقراءة ملفات Tab-Delimited. أنه microsoft.visualbasic.fileio.textfileperser..

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