我有一个包含大量多余数据的.dat文件(数千行我只需要几百行)。我目前有一段能够读取并过滤它的代码。以前,我正在将汇总数据输出到控制台中(这是当前代码所做的),但是我现在需要能够输出与excel可读文件相关的每个单独的行。包含的数据是ASCII格式。
如果可能的话,我试图避免使用linq,因为我并不真正了解它,而我只是在不使用它来应对难度级别。
从研究来看,最有效的方法是让C#读取文件,将所有内容作为列表存储到内存中,然后将整个列表写入excel。我很乐意手动完成其余工作,一旦这个列表在excel中,它只是从c#中获取列表并将其转储到excel列中的情况。鉴于所有数据都具有固定长度,我对如何完成这一操作并没有太大限制,但如果可能的话,我希望将每个变量写入新列,而不是将其全部写入A列。 / p>
当前代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using NsExcel = Microsoft.Office.Interop.Excel;
class Program
{
static void Main(string[] args)
{
List<string> myList = new List<string>();
int i = 1;
using (StreamReader reader = new StreamReader("file.dat"))
{
string line;
var locations = new Dictionary<string, int[]>() {
{"210", new [] {405, 4, 128, 12, 141, 12, 247, 15, 121, 3}},
{"310", new [] {321, 4, 112, 12, 125, 12, 230, 15, 105, 3}},
{"410", new [] {477, 4, 112, 12, 125, 12, 360, 15, 105, 3}}
};
while ((line = reader.ReadLine()) != null)
{
var lineStart = line.Substring(0, 3);
if (lineStart == "210" || lineStart == "310" || lineStart == "410")
{
var currentLocations = locations[lineStart];
var letters = line.Substring(currentLocations[0], currentLocations[1]);
var tvolume =
int.Parse(line.Substring(currentLocations[2], currentLocations[3])) +
int.Parse(line.Substring(currentLocations[4], currentLocations[5]));
var tprice = long.Parse(line.Substring(currentLocations[6], currentLocations[7]));
var mvolume = tprice * tvolume * 0.01 * 0.0000001;
var currency = line.Substring(currentLocations[8], currentLocations[9]);
// double total = myList.
Console.WriteLine(i);
Console.WriteLine(lineStart);
Console.WriteLine(letters);
Console.WriteLine(tvolume * 0.01);
Console.WriteLine(tprice * 0.0000001);
Console.WriteLine("{0:N}", mvolume);
Console.WriteLine(currency + "\n");
i = i + 1;
}
}
//Dictionary<string, int> tvolumeDictionary = new Dictionary<string, int>();
//Dictionary<string, double> mvolumeDictionary = new Dictionary<string, double>();
}
}
}
答案 0 :(得分:2)
如果您只有一个数据文件,则可以解析数据(就像您已经拥有的那样)并将该数据写入一个简单的文本文件,并将该文件中的内容直接复制粘贴到Excel中。我不是Excel用户,但如果您使用例如制表符('\ t')拆分数据,它应自动将内容从一行放入单独的列中。
// Construct a tab-separated string with your variables:
StringBuilder str = new StringBuilder();
str.Append(i.ToString());
str.Append("\t");
str.Append(lineStart.ToString());
str.Append("\t");
str.Append(letters.ToString());
...
// Push the string into your list:
myList.Add(str.ToString());
...
// Finally, you can write the contents of your list into a text file:
System.IO.File.WriteAllLines("output.txt", myList.ToArray());
然后,只需打开 output.txt 文件并将内容复制粘贴到Excel中。
修改:与 VoidMain 指出,您只需用分号(';')替换制表符('/ t')即可将文件另存为 output.cvs ,然后希望Excel能够按原样打开它。
答案 1 :(得分:0)
您可以使用CSV格式,这比编写xls或xlsx文件(Microsoft Excel格式)要简单得多。 您可以手动编写csv文件或使用任何现成的csv .net库,例如:
http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html