2017-06-20 22 views
1

私はCSVファイル「クリーン」したいと思います:CSVファイルから空の行や列を削除する - C#

  • 空の列

行または列を削除する空の行

  • を削除例えば、 ""、 ""、 "" "" "" "" "" "" "" "" "" "" "" 」、「 (行形式) または 「」「」「」「」「」「」「」「」「」「」「」 (行形式) OR

    ""、

    ""、

    ""、

    ""、

    ""、

    ""、

    」 "、

    (列形式)

    これらの行または列は、CSVファイルのどこにでも配置できます。私がこれまで持って何

    Remove Blank rows from csv c#

    private void button1_Click(object sender, EventArgs e) 
         { 
    
          string sourceFile = @"XXXXX.xlsx"; 
          string worksheetName = "Sample"; 
          string targetFile = @"C:\Users\xxxx\xls_test\XXXX.csv"; 
    
          // Creates the CSV file based on the XLS file 
          ExcelToCSVCoversion(sourceFile, worksheetName, targetFile); 
    
          // Manipulate the CSV: Clean empty rows 
          DeleteEmptyRoadFromCSV(targetFile); 
         } 
    
         static void ExcelToCSVCoversion(string sourceFile, string worksheetName, 
          string targetFile) 
         { 
          string connectionString = @"Provider =Microsoft.ACE.OLEDB.12.0;Data Source=" + sourceFile 
           + @";Extended Properties=""Excel 12.0 Xml;HDR=YES"""; 
          OleDbConnection connection = null; 
          StreamWriter writer = null; 
          OleDbCommand command = null; 
          OleDbDataAdapter dataAdapter = null; 
    
          try 
          { 
           // Represents an open connection to a data source. 
           connection = new OleDbConnection(connectionString); 
           connection.Open(); 
    
           // Represents a SQL statement or stored procedure to execute 
           // against a data source. 
           command = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", 
                  connection); 
           // Specifies how a command string is interpreted. 
           command.CommandType = CommandType.Text; 
           // Implements a TextWriter for writing characters to the output stream 
           // in a particular encoding. 
           writer = new StreamWriter(targetFile); 
           // Represents a set of data commands and a database connection that are 
           // used to fill the DataSet and update the data source. 
           dataAdapter = new OleDbDataAdapter(command); 
    
           DataTable dataTable = new DataTable(); 
           dataAdapter.Fill(dataTable); 
    
           for (int row = 0; row < dataTable.Rows.Count; row++) 
           { 
            string rowString = ""; 
            for (int column = 0; column < dataTable.Columns.Count; column++) 
            { 
             rowString += "\"" + dataTable.Rows[row][column].ToString() + "\","; 
            } 
            writer.WriteLine(rowString); 
           } 
    
           Console.WriteLine(); 
           Console.WriteLine("The excel file " + sourceFile + " has been converted " + 
                "into " + targetFile + " (CSV format)."); 
           Console.WriteLine(); 
          } 
          catch (Exception exception) 
          { 
           Console.WriteLine(exception.ToString()); 
           Console.ReadLine(); 
          } 
          finally 
          { 
           if (connection.State == ConnectionState.Open) 
           { 
            connection.Close(); 
           } 
           connection.Dispose(); 
           command.Dispose(); 
           dataAdapter.Dispose(); 
           writer.Close(); 
           writer.Dispose(); 
          } 
         } 
    
         static void DeleteEmptyRoadFromCSV(string fileName) 
         { 
          //string nonEmptyLines = @"XXXX.csv"; 
          var nonEmptyLines = File.ReadAllLines(fileName) 
             .Where(x => !x.Split(',') 
                .Take(2) 
                .Any(cell => string.IsNullOrWhiteSpace(cell)) 
             // use `All` if you want to ignore only if both columns are empty. 
             ).ToList(); 
    
         File.WriteAllLines(fileName, nonEmptyLines); 
         } 
    

    は最後に、私からのアイデアを使用しようとしました。しかし、私の出力は全く変化していません。

    何か助けてください!

    ありがとうございます。

  • +2

    var nonEmptyLines = File.ReadAllLines(FileName) .Where(x => !x.Split(',') .Take(2) .Any(cell => string.IsNullOrWhiteSpace(cell)) // use 'All' if you want to ignore only if both columns are empty. ).ToList(); 

    私はあなたのように何かを使用することができると思います車輪?テキストファイルパーサを使用することができれば、それはもっと頑強になるはずです。 –

    +2

    また、 'File.ReadAllLines'はおそらくあなたが小さなファイルを扱っているのを知っていない限り危険です。 – GibralterTop

    +0

    おそらくここでLinqが役立ちます。空の行や列はスキップできます。また、あなたのコードを少しきちんと整理するのに役立つかもしれません。 –

    答えて

    1

    csvを保存する前に、表から列/行を削除できます。 メソッドはテストされていませんが、コンセプトを取得する必要があります。

    static void ExcelToCSVCoversion(string sourceFile, string worksheetName, 
         string targetFile) 
        { 
         string connectionString = @"Provider =Microsoft.ACE.OLEDB.12.0;Data Source=" + sourceFile 
          + @";Extended Properties=""Excel 12.0 Xml;HDR=YES"""; 
         OleDbConnection connection = null; 
         StreamWriter writer = null; 
         OleDbCommand command = null; 
         OleDbDataAdapter dataAdapter = null; 
    
         try 
         { 
          // Represents an open connection to a data source. 
          connection = new OleDbConnection(connectionString); 
          connection.Open(); 
    
          // Represents a SQL statement or stored procedure to execute 
          // against a data source. 
          command = new OleDbCommand("SELECT * FROM [" + worksheetName + "$]", 
                 connection); 
          // Specifies how a command string is interpreted. 
          command.CommandType = CommandType.Text; 
          // Implements a TextWriter for writing characters to the output stream 
          // in a particular encoding. 
          writer = new StreamWriter(targetFile); 
          // Represents a set of data commands and a database connection that are 
          // used to fill the DataSet and update the data source. 
          dataAdapter = new OleDbDataAdapter(command); 
    
          DataTable dataTable = new DataTable(); 
          dataAdapter.Fill(dataTable); 
          var emptyRows = 
           dataTable.Select() 
            .Where(
             row => 
              dataTable.Columns.Cast<DataColumn>() 
               .All(column => string.IsNullOrEmpty(row[column].ToString()))).ToArray(); 
          Array.ForEach(emptyRows, x => x.Delete()); 
    
          var emptyColumns = 
           dataTable.Columns.Cast<DataColumn>() 
            .Where(column => dataTable.Select().All(row => string.IsNullOrEmpty(row[column].ToString()))) 
            .ToArray(); 
          Array.ForEach(emptyColumns, column => dataTable.Columns.Remove(column)); 
          dataTable.AcceptChanges(); 
    
          for (int row = 0; row < dataTable.Rows.Count; row++) 
          { 
           string rowString = ""; 
           for (int column = 0; column < dataTable.Columns.Count; column++) 
           { 
            rowString += "\"" + dataTable.Rows[row][column].ToString() + "\","; 
           } 
           writer.WriteLine(rowString); 
          } 
    
          Console.WriteLine(); 
          Console.WriteLine("The excel file " + sourceFile + " has been converted " + 
               "into " + targetFile + " (CSV format)."); 
          Console.WriteLine(); 
         } 
         catch (Exception exception) 
         { 
          Console.WriteLine(exception.ToString()); 
          Console.ReadLine(); 
         } 
         finally 
         { 
          if (connection.State == ConnectionState.Open) 
          { 
           connection.Close(); 
          } 
          connection.Dispose(); 
          command.Dispose(); 
          dataAdapter.Dispose(); 
          writer.Close(); 
          writer.Dispose(); 
         } 
        } 
    
    +0

    ちょっと これはいいアイデアだと思いますが、私は動かすことができませんでした。 部品: emptyRows.ForEach(x => x.Delete()); と emptyColumns.ForEach(column => dataTable.Columns.Remove(column)); "Array.ForEach、T>(T []、Action )の必須の仮パラメータ 'action'に対応する引数がありません '" - >例外:ArgumentNullExpection 試しました成功しません。 foreach(varRow in emptyRows) { (x => x.Delete()); } –

    +0

    ForEachステートメントを更新しました。今すぐご確認ください。 –

    +0

    それは働いている! 私は、CSVの代わりにXLSを使って作業することははるかに複雑になると思っていましたが、あなたのソリューションでは機能しています! 本当にありがとうございます! –

    0

    次のクエリは、working.Iは、すべての行を取得していているかどうかを確認してください:あなたは再発明しているのはなぜ

    var nonEmptyLines = File.ReadAllLines(File). 
             SkipWhile(cell=>{var arr=cell.Split(',');if(string.IsNullOrWhiteSpace(cell)){ 
              return true; 
             } 
              else 
             { 
              return false; 
             } 
             }); 
    
    +0

    ちょっと 私は両方を試みました。 これらは正常に実行されていますが、出力(CSV)は同じままです。 デバッグが表示されます https://drive.google.com/drive/folders/0B98UpTa2n4XbeHZtOHU2cVotUms?usp=sharing(申し訳ありませんが、画像の添付ファイルはここでは機能しません) –

    関連する問題