2014-05-15 71 views
0

对于我们公司正在使用的合并应用程序,我有点尴尬。我们从进度数据库创建一个csv文件,这个csv文件有14列和NO头。csv修改文件

CSV文件包含付款(约173,000行)。大多数这些行的是除了列金额(最后一列)相同

例子:

2014;MONTH;;SC;10110;;;;;;;;EUR;-6500000 
2014;01;;SC;10110;;;;;;;;EUR;-1010665 
2014;01;;LLC;11110;;;;;;;;EUR;-6567000 
2014;01;;SC;10110;;;;;;;;EUR;-1110665 
2014;01;;LLC;11110;;;;;;;;EUR;65670.00 
2014;01;;SC;10110;;;;;;;;EUR;-11146.65 

(约174000行)

正如你可以看到一些这些线是除了相同为金额列。我需要的是排序所有行,加起来的金额和保存一个独特的行而不是1100行与不同的金额。

我的编码技巧无法让我在特定的时间范围内完成工作,也许你们中的一个可以让我朝正确的方向解决这个问题。

实施例代码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = File.ReadAllText(@"c:\temp\test.txt"); 
      string inputLine = ""; 
      StringReader reader = new StringReader(input); 
      List<List<string>> data = new List<List<string>>(); 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       if (inputLine.Trim().Length > 0) 
       { 
        string[] inputArray = inputLine.Split(new char[] { ';' }); 
        data.Add(inputArray.ToList()); 
       } 
      } 
      //sort data by every column 
      for (int sortCol = data[0].Count() - 1; sortCol >= 0; sortCol--) 
      { 
       data.OrderBy(x => x[sortCol]); 
      } 
      //delete duplicate rows 
      for (int rowCount = data.Count - 1; rowCount >= 1; rowCount--) 
      { 
       Boolean match = true; 
       for (int colCount = 0; colCount < data[rowCount].Count - 2; colCount++) 
       { 
        if(data[rowCount][colCount] != data[rowCount - 1][colCount]) 
        { 
         match = false; 
         break; 
        } 
       } 
       if (match == true) 
       { 
        decimal previousValue = decimal.Parse(data[rowCount - 1][data[rowCount].Count - 1]); 
        decimal currentValue = decimal.Parse(data[rowCount][data[rowCount].Count - 1]); 
        string newStrValue = (previousValue + currentValue).ToString(); 
        data[rowCount - 1][data[rowCount].Count - 1] = newStrValue; 
        data.RemoveAt(rowCount); 
       } 
      } 

      string output = string.Join("\r\n",data.AsEnumerable() 
       .Select(x => string.Join(";",x.Select(y => y).ToArray())).ToArray()); 
      File.WriteAllText(@"c:\temp\test1.txt",output); 
     } 
    } 
} 
+4

你已经尝试到目前为止 –

+0

是输入文件相当小,使得它可以完全读入内存? – Codor

+0

如果您从数据库创建CSV文件,这意味着您可以直接使用数据库?这在数据库级上要容易得多。 – Richard

回答

2

阅读由线CSV文件线,并建立在其中保持的总计(和其它信息您需要)在内存中的字典。由于大多数线路属于同一个密钥,因此它可能不会导致内存不足问题。之后,根据字典中的信息生成新的CSV。

0

正如我理解你的问题,你的问题,你所要求的解决方案是如何把你的输入是在

@"2014;MONTH;;SC;10110;;;;;;;;EUR;-6500000 
2014;01;;SC;10110;;;;;;;;EUR;-1010665 
2014;01;;LLC;11110;;;;;;;;EUR;-6567000 
2014;01;;SC;10110;;;;;;;;EUR;-1110665 
2014;01;;LLC;11110;;;;;;;;EUR;65670.00 
2014;01;;SC;10110;;;;;;;;EUR;-11146.65" 

形式获取的最后一列,然后总结一下?如果是这样这其实是很容易像这样的东西

public static void Main() 
    { 
     string input = @"2014;MONTH;;SC;10110;;;;;;;;EUR;-6500000 
2014;01;;SC;10110;;;;;;;;EUR;-1010665 
2014;01;;LLC;11110;;;;;;;;EUR;-6567000 
2014;01;;SC;10110;;;;;;;;EUR;-1110665 
2014;01;;LLC;11110;;;;;;;;EUR;65670.00 
2014;01;;SC;10110;;;;;;;;EUR;-11146.65"; 

     var rows = input.Split('\n'); 

     decimal totalValue = 0m; 

     foreach(var row in rows) 
     {   
      var transaction = row.Substring(row.LastIndexOf(';') +1); 

      decimal val = 0m; 

      if(decimal.TryParse(transaction, out val)) 
       totalValue += val; 
     } 

     Console.WriteLine(totalValue); 
    } 

做不过也许我误解你问什么?

0

对不起回答我的帖子这么晚了,但是这是我的最终解决方案

更换所有“字和写的输出流作家。(从25MB去一个15MB的文件)。不是复制我的CSV文件我的新文件只有+/- 700KB!

Filldata()方法正在填充SQL Server,因此我可以批量插入。插入后,我只是查询表和读/写结果集到一个新的文件。在我的应用程序datagridview,以便您可以查看结果,而不是在Excel中打开该文件。

我是新的与C#,我目前wri直接或在内存中查询csv文件并将其写回新文件的新解决方案。

方法一:

   string line; 

       StreamWriter sw = new StreamWriter(insertFile); 

       using (StreamReader sr = new StreamReader(sourcePath)) 
       { 
        while ((line = sr.ReadLine()) != null) 
        { 
         sw.WriteLine(line.Replace("\"", "")); 
        } 

        sr.Close(); 
        sw.Close(); 
        sr.Dispose(); 
        sw.Dispose(); 

        File.Copy(insertFile, @"\\SQLSERVER\C$\insert.csv"); 

       } 

方法2:

var destinationFile = @"c:\insert.csv"; 

       var querieImportCSV = "BULK INSERT dbo.TABLE FROM '" + destinationFile + "' WITH (FIELDTERMINATOR = ';', ROWTERMINATOR = '\n', FIRSTROW = 1)"; 
       var truncate = @"TRUNCATE TABLE dbo.TABLE"; 

       string queryResult = 
     @"SELECT [Year] 
       ,[Month] 
       ,[Week] 
       ,[Entity] 
       ,[Account] 
       ,[C11] 
       ,[C12] 
       ,[C21] 
       ,[C22] 
       ,[C3] 
       ,[C4] 
       ,[CTP] 
       ,[VALUTA] 
       ,SUM(AMOUNT) as AMOUNT 
       ,[CURRENCY_ORIG] 
       ,[AMOUNTEXCH] 
       ,[AGENTCODE] 
      FROM dbo.TABLE 
      GROUP BY YEAR, MONTH, WEEK, Entity, Account, C11, C12, C21, C22, C3, C4, CTP, VALUTA, CURRENCY_ORIG, AMOUNTEXCH, AGENTCODE 
      ORDER BY Account"; 

       var conn = new SqlConnection(connectionString); 

       conn.Open(); 
       SqlCommand commandTruncate = new SqlCommand(truncate, conn); 
       commandTruncate.ExecuteNonQuery(); 

       SqlCommand commandInsert = new SqlCommand(querieImportCSV, conn); 
       SqlDataReader readerInsert = commandInsert.ExecuteReader(); 
       readerInsert.Close(); 

       FillData(); 

       SqlCommand commandResult = new SqlCommand(queryResult, conn); 
       SqlDataReader readerResult = commandResult.ExecuteReader(); 

       StringBuilder sb = new StringBuilder(); 

       while (readerResult.Read()) 
       { 
         sb.Append(readerResult["Year"] + ";" + readerResult["Month"] + ";" + readerResult["Week"] + ";" + readerResult["Entity"] + ";" + readerResult["Account"] + ";" + 
         readerResult["C11"] + ";" + readerResult["C12"] + ";" + readerResult["C21"] + ";" + readerResult["C22"] + ";" + readerResult["C3"] + ";" + readerResult["C4"] + ";" + 
         readerResult["CTP"] + ";" + readerResult["Valuta"] + ";" + readerResult["Amount"] + ";" + readerResult["CURRENCY_ORIG"] + ";" + readerResult["AMOUNTEXCH"] + ";" + readerResult["AGENTCODE"]); 
       } 
       sb.Replace("\"",""); 

       StreamWriter sw = new StreamWriter(homedrive); 
       sw.WriteLine(sb); 

       readerResult.Close(); 
       conn.Close(); 
       sw.Close(); 
       sw.Dispose();