在c#中解析固定位置ascii文件的最佳方法是什么?

时间:2014-02-01 01:14:16

标签: c#

我有一个我需要解析的固定位置ascii文件。该文件作为包含数百或数千行的文本文档传入。每行宽约100个字符。每个数据元素的长度都不同。我真的不想手动解析每个数据元素。我记得方式,回到我用“C”编码的那一天,我们可以获取一些数据,并覆盖一个结构,然后引用结构中的数据元素。我做了一些研究,我没有看到任何关于如何在C#中执行此操作的可靠示例。有关如何解析此数据的任何建议吗?

这是数据的示例:

John Doe先生123 Main St. New York NY11111
MrsMelissa Schwartzen4444 Mississippi St.Philadelphia PA11111

标题 - 从第0列开始,长度为3。 FirstName - 从第3列开始,长度为10。 LastName - 从第13列开始,长度为10。 地址 - 从第23栏开始,长度为20。 城市 - 从第43栏开始,长度为15。 状态 - 从第58列开始,长度为2。 Zip - 从第60列开始,长度为5.

解析这些数据的第一个想法可能是遍历文件中的每一行并获得Title,FirstName,LastName,Address等的子字符串。但是必须有一种更优雅的方法来解析这些数据。这就是为什么我问是否有办法使用指针并用结构覆盖数据。这是一个非托管解决方案,但我想不出更好的方法来解决这个问题。除非你们中的一个聪明聪明的人能够提出建议。

1 个答案:

答案 0 :(得分:0)

微软足以为我们提供TextFieldParser课程。

这是example如何使用它。

  
    

示例页面中的代码

  
Using Reader As New Microsoft.VisualBasic.FileIO.
   TextFieldParser("C:\TestFolder\test.log")

   Reader.TextFieldType =
      Microsoft.VisualBasic.FileIO.FieldType.FixedWidth
   Reader.SetFieldWidths(5, 10, 11, -1)
   Dim currentRow As String()
   While Not Reader.EndOfData
      Try
         currentRow = Reader.ReadFields()
         Dim currentField As String 
         For Each currentField In currentRow
            MsgBox(currentField)
         Next 
      Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
         MsgBox("Line " & ex.Message &
         "is not valid and will be skipped.")
      End Try 
   End While 
End Using