0

我有一个 .dat 文件,其中包含很多多余的数据(几千行我只需要几百行)。我目前有一段代码能够读取并过滤它。以前,我使用这个(这是当前代码所做的)将摘要数据输出到控制台,但是我现在需要能够将与 Excel 可读文件相关的每一行输出。包含的数据为 ASCII 格式。

如果可能,我会尽量避免使用 linq,因为我并不真正理解它,而且我只是在应对不使用它带来的困难程度。

根据研究,看起来最有效的方法是让 C# 读取文件,将所有内容作为列表存储到内存中,然后将整个列表写入 excel。我很乐意手动完成其余的工作,一旦这个列表在 excel 中,它只是从 c# 中获取列表并将其转储到 excel 列中的一个例子。鉴于所有数据都将具有固定长度,我在如何完成这方面并没有受到很大限制,但如果可能的话,我希望将每个变量写入一个新列,而不是将其全部写入 A 列。

当前代码:

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>();



            }
        }
    }
4

2 回答 2

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 能够按原样打开它。

于 2012-12-06T16:34:41.783 回答
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

于 2012-12-06T14:26:31.590 回答