2011-06-17 11 views
0

カラム値に基づいてcsvファイルからいくつかの行を削除する必要があります。ここに私のsample.csvファイルは私vb.net winforomアプリケーションでファイルからデータを削除する

Name  no  date  sal 
abc  12  06/06/10 2345 
xyz  11  06/06/10 2321 
qwe  10  05/07/10 4323 
asd  10  05/07/10 3221 

ですが、私はこのファイルを読み込み、06/06/10日付列値に関連する行を削除する必要がありますする必要があり、その後に残りの行を書きますnew.csvファイル。これまでのところ、私のプログラムはファイル内にあるデータ全体を読み込む作業をしています。これについての提案はどうですか?ここで

は私のコードです:

Dim ioFile As New System.IO.StreamReader("C:\sample.csv")  
Dim ioLine As String 
Dim ioLines As String  
ioLine = ioFile.ReadLine  
ioLines = "ID,Name,Number,Amount" 
ioLines &= vbCrLf & ioLine 
While Not ioLine = ""   
    ioLine = ioFile.ReadLine   
    ioLines = ioLines & vbCrLf & ioLine  
End While  
Dim ioWriter As New System.IO.StreamWriter("C:\new.csv")  
ioWriter.WriteLine(ioLines)  
ioFile.Close()  
ioWriter.Close() 

答えて

2

うまくいけば、これはあなたが始められるでしょう(それがあなたのサンプルファイルからのケースのように見えるように私は、固定列幅を仮定):

Const dateColumnOffset As Integer = 16 ' I hope I counted that right 
Const dateColumnWidth As Integer = 8 
Using writer As StreamWriter = File.CreateText("new.csv") 
    For Each line As String In File.ReadLines("sample.csv") 
     Dim recordDate As String = line.Substring(dateColumnOffset, dateColumnWidth) 
     If recordDate <> "06/06/10" Then 
      writer.WriteLine(line) 
     End If 
    Next 
End Using 
+0

に変更されます。列の値には固定長はありません。ちょうどサンプルCSVファイルを提供するために、私は固定長のデータを与えました。可変長でどうすればいいですか? – Ram

+0

実際のデータの例を挙げてください。誰かが助けてくれるかもしれません。 – Sven

0

これがされ非常に素朴でシンプルなソリューションであり、非常に小さなファイルで作業していること、パフォーマンスを気にせず、.csvデータ自体にコンマが含まれていないことを前提としています。しかし、あなたはそう述べるなかったので、のは、仕事を得ることが目的であると仮定しましょう、これはそれを行います。

Dim data() As String = System.IO.File.ReadAllLines("C:\Temp\sample.csv") 
Dim newData = From a In data Where DateTime.Parse(a.Split(","c)(2)) <> #6/10/10# 
System.IO.File.WriteAllLines("C:\Temp\new.csv", newData) 

をあなたがこれをスピードアップするか、より大きなファイルを処理し、あなたのファイルリーダーをラップする必要がある場合ReadAllLines()を使用してファイル全体を一度にメモリに読み込む代わりに、ReadLine()呼び出しを生成するIEnumerableで使用します。 .CSVに識別子とカンマが引用されている場合は、より高度な.CSVリーダーを使用する必要があります。マイクロソフトはSee hereに1を組み込んだ。

- EDIT - 要求パー

は、ここにあなたがVBでフ​​ァイルの行の列挙子を行うことができる方法です。このクラスでは、コードはFrom a In New TextFileEnumerator("C:\Temp\sample.csv") Where...

''' Handy helper class for iterating over lines in a text file. Lets you do something like a 
''' Linq-to-files. 
''' </summary> 
Public Class TextFileEnumerator 
    Implements IEnumerator(Of String), IEnumerable(Of String) 

    Private _filePath As String 
    Private _rdr As StreamReader 
    Private _line As String 

    Private ReadOnly Property StreamReader() As StreamReader 
     Get 
     _rdr = If(_rdr, New StreamReader(_filePath)) 
     Return _rdr 
     End Get 
    End Property 

    Public Sub New(filePath As String) 
     If Not System.IO.File.Exists(filePath) Then Throw New FileNotFoundException(filePath) 
     _filePath = filePath 
    End Sub 

    Public ReadOnly Property Current As String Implements System.Collections.Generic.IEnumerator(Of String).Current 
     Get 
     Return _line 
     End Get 
    End Property 

    Public ReadOnly Property Current1 As Object Implements System.Collections.IEnumerator.Current 
     Get 
     Return _line 
     End Get 
    End Property 

    Public Function MoveNext() As Boolean Implements System.Collections.IEnumerator.MoveNext 
     _line = Me.StreamReader.ReadLine() 
     Return (_line IsNot Nothing) 
    End Function 

    Public Sub Reset() Implements System.Collections.IEnumerator.Reset 
     If _rdr IsNot Nothing Then 
     _rdr.Close() 
     End If 
     _rdr = Nothing 
    End Sub 

    Public Function GetEnumerator() As System.Collections.Generic.IEnumerator(Of String) Implements System.Collections.Generic.IEnumerable(Of String).GetEnumerator 
     Return Me 
    End Function 

    Public Function GetEnumerator1() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator 
     Return Me 
    End Function 

#Region "IDisposable Support" 
    Private disposedValue As Boolean ' To detect redundant calls 

    ' IDisposable 
    Protected Overridable Sub Dispose(disposing As Boolean) 
     If Not Me.disposedValue Then 
     If disposing Then 
      If _rdr IsNot Nothing Then 
       _rdr.Close() 
       _rdr.Dispose() 
       _rdr = Nothing 
      End If 
     End If 

     ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. 
     ' TODO: set large fields to null. 
     End If 
     Me.disposedValue = True 
    End Sub 

    ' TODO: override Finalize() only if Dispose(disposing As Boolean) above has code to free unmanaged resources. 
    'Protected Overrides Sub Finalize() 
    ' ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above. 
    ' Dispose(False) 
    ' MyBase.Finalize() 
    'End Sub 

    ' This code added by Visual Basic to correctly implement the disposable pattern. 
    Public Sub Dispose() Implements IDisposable.Dispose 
     ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above. 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 
#End Region 

End Class 
+0

私はプログラミングに非常に新しいので、IEnumerableを使用してこの問題のサンプルコードを提供してください。 – Ram

関連する問題