對於我們公司正在使用的合併應用程序,我有點尷尬。我們從進度數據庫創建一個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);
}
}
}
你已經嘗試到目前爲止 –
是輸入文件相當小,使得它可以完全讀入內存? – Codor
如果您從數據庫創建CSV文件,這意味着您可以直接使用數據庫?這在數據庫級上要容易得多。 – Richard