تجنب أخطاء "نهاية الملف"
-
16-09-2019 - |
سؤال
أحاول استيراد ملف محدد علامة التبويب إلى جدول.
المشكلة هي أنه في بعض الأحيان، سيتضمن الملف سجل محرج يحتوي على اثنين من "قيم فارغة" ويسبب برنامجي لرمي "نهاية غير متوقعة".
على سبيل المثال، سيكون لكل سجل 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..