不可能。
シークは、ファイル内の特定の位置に移動できます。レコード長が非常に大きく、レコード数が少ない固定長レコード (SDF/COBOL) ファイルがある場合、これは問題ありません。
残念ながら、.csv は定義上、可変長レコードです。レコードの最後で cr/lf を押すことに基づいて、1 つのレコードがどこで停止して開始するかしかわかりません。
また、ほとんどの固定レコード形式でも、これは良い考えではありません。バッファリングのため、OS がプリロードした量よりも少ない量を先にシークするため、OS はとにかくファイル全体を読み取ります。
あなたがこれをやりたい理由はわかります。直感的には、そのほうが速いように思えます。常に速度を念頭に置いてコードを設計する必要がありますが、これは「時期尚早の最適化」と見なされるほど低レベルです-グーグル。基本的には、それを書くことによって実行速度が遅いことを自分自身で証明する必要があります。その後、それが機能の大きな障害であることがわかったら、最適化できます。
自分で解析しないでください。
MSにはそのためのアセンブリがあります。Microsoft.VisualBasic.FileIO.TextFieldParser
. はい、C# で使用できます (以下のサンプルは VB ですが、何をする必要があるかは理解できます)。VB への参照を含めることを誇りに思う必要はありません。「10 フィートのポールを持った VB には何も触れない」とは言えません。変更は、アセンブリがターゲット PC で既に行われていることです。唯一の懸念は、プログラム インストール パッケージのダウンロード サイズの問題があるか、PC 以外のプラットフォームに展開している場合です。
Using Reader As New Microsoft.VisualBasic.FileIO.TextFieldParser(CSVPath)
Reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
Reader.Delimiters = New String() {","}
Reader.TrimWhiteSpace = True
Reader.HasFieldsEnclosedInQuotes = True
While Not Reader.EndOfData
Try
Dim st2 As New List(Of String)
st2.addrange(Reader.ReadFields())
If iCount > 0 Then ' ignore first row = field names
Dim p As New clsPerson
p.CSVLine = st2
While p.CSVLine.Count < 15
p.CSVLine.Add("")
End While
p.FirstName = st2(1).Trim
If st2.Count > 2 Then
p.MiddleName = st2(2).Trim
Else
p.MiddleName = ""
End If
p.LastNameSuffix = st2(0).Trim
If st2.Count >= 6 Then
p.TestCase = st2(5).Trim
End If
If st2(3) > "" Then
p.CertsFromCase.Add(st2(3))
End If
cases.Add(p)
Else
stFirstRow = CatLine(st2.ToArray)
Dim st3(6) As String
For kk As Integer = 0 To Math.Min(st2.Count - 1, 5)
st3(kk) = st2(kk)
Next
If 0 = InStr(st3(0), "Last Name", CompareMethod.Text) Or _
0 = InStr(st3(1), "First Name", CompareMethod.Text) Or _
0 = InStr(st3(2), "Middle Name", CompareMethod.Text) Or _
0 = InStr(st3(3), "Policy", CompareMethod.Text) Or _
0 = InStr(st3(5), "Test Case", CompareMethod.Text) Then
stFirstRow = "Last Name,First Name,Middle Name,Policy,,Test Case #" & vbCrLf & stFirstRow
End If
End If
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & " is not valid and will be skipped.")
End Try
iCount += 1
End While
End Using