0

余分なデータがたくさん含まれている.datファイルがあります(数千行のうち、必要なのは数百行だけです)。私は現在、それを読み取ってフィルタリングできるコードを持っています。以前は、これを使用してサマリーデータをコンソールに出力していましたが(現在のコードはこれを実行します)、関連する個々の行をExcelで読み取り可能なファイルに出力できるようにする必要があります。含まれるデータはASCII形式です。

linqはよくわからないので、できるだけ使用を避けようとしています。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

データファイルが1つしかない場合は、データを解析して(既に持っているように)、そのデータを単純なテキストファイルに書き込み、そのファイルからコンテンツをコピーして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 に答える