| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3243 人关注过本帖, 1 人收藏
标题:CSV合并的问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
嗯,那個不理它了。我寫好測試過後再給你。

授人以渔,不授人以鱼。
2015-03-10 21:14
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 

從註冊到現在,來這這麼久,第一次有人幫寫程式給我耶,好緊張喔。

嚴格說VB版的以前某板主有給過一次。C版是第一次。

[ 本帖最后由 wube 于 2015-3-10 21:20 编辑 ]

不要選我當版主
2015-03-10 21:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我用vs2013 C#寫的,你自己移植哦,如果不行,你可以要求改用。我不會

授人以渔,不授人以鱼。
2015-03-10 21:22
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
C#還OK,反正公司有人會。反而比較冷門沒人會。

不要選我當版主
2015-03-10 21:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using namespace wube_01
{
    class Program
    {
        static internal Int32 TitleLines;
        static internal List<StringBuilder> TargetData = new List<StringBuilder>();

        static internal void Main(String[] args)
        {
            String programFileName = Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]);

            if ((args.Length < 3) || !Int32.TryParse(args[2], out TitleLines))
            {
                ShowTips(programFileName);
                return;
            }

            String targetFileName = args[0];
            String sourceDataPath = args[1];
            String[] files = Directory.GetFiles(sourceDataPath);
            for (Int32 index = 0; index < files.Length; ++index)
            {
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("正在處理{0},請稍候...", Path.GetFileName(files[index]));
                Merger(targetFileName, files[index]);
            }
            WriteOutputFile(targetFileName);

            Console.Write("按回車鍵結束程序...");
            Console.ReadLine();
        }

        // 顯示命令行語法幫助
        static internal void ShowTips(String programFileName)
        {
            Console.WriteLine("格式: {0} 輸出文檔名 \"數據源文檔所在路徑\" 標題行數", programFileName);
            Console.WriteLine("例: {0} AAAA.csv \"Data\" 6", programFileName);
            Console.WriteLine("    數據源文檔放在當前目錄的子目錄Data中,標題佔用6行");
        }

        // 合併兩個文檔
        static internal void Merger(String targetFileName, String sourceFileName)
        {
            StreamReader sourceReader = (new FileInfo(sourceFileName)).OpenText();
            Int32 index = 0;
            while (!sourceReader.EndOfStream)
            {
                String sourceLine = sourceReader.ReadLine();
                if (index >= TargetData.Count)
                {
                    TargetData.Add(new StringBuilder(sourceLine));
                }
                else
                {
                    TargetData[index].Append(sourceLine);
                }
                ++index;
            }
            sourceReader.Close();
        }

       // 寫最終輸出文檔
       static internal void WriteOutputFile(String fileName)
        {
            StreamWriter targetWriter = (new FileInfo(fileName)).CreateText();
            foreach (StringBuilder line in TargetData)
            {
                targetWriter.WriteLine(line);
            }
            targetWriter.Close();
        }
    }
}



[ 本帖最后由 TonyDeng 于 2015-3-10 22:37 编辑 ]
收到的鲜花
  • wube2015-03-11 02:52 送鲜花  10朵   附言:這邊很少有人這麼熱心,願意花時間和精神寫 ...

授人以渔,不授人以鱼。
2015-03-10 22:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
怎麽建立項目和怎麽用,看代碼以及注釋,應該可以知道的,我就不寫了。這程序處理285個文檔,是瞬間完成。理解原理之後,改回非托管程序也很容易,但現在這樣托管的,速度已經足夠滿意了。

[ 本帖最后由 TonyDeng 于 2015-3-10 22:53 编辑 ]

授人以渔,不授人以鱼。
2015-03-10 22:45
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
其實你寫簡體我也看得懂,比較不懂的是,有些名詞和描述狀況的方法,比較無法立即了解,還要再慢慢意會。
程式基本上光用看的應該是一支獨立完整的程式,不只是一個副程式了,大致上還蠻淺顯易懂的,但是關鍵地方我還要再琢磨琢磨。
不知道2008能不能運行,不然我還不知道要去哪生2012。明天上班再仔細看看,晚上實在很冷,腳都快凍到沒感覺了,
就先擱著明天再看。看代碼如果要自己轉成VC應該也行,先謝謝囉。

不要選我當版主
2015-03-11 02:47
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
基本上你這麼有誠意,如果可以,我也願意將原檔丟出來,當然會改掉一些敏感的機密字眼,但保證不會影響編成。
只是這樣可能有點要求太超過了,會不好意思,把工作丟給你,就當作做是參考吧,也可以順便提一些意見交流一下,
也許可以讓我知道我邊程上的盲點。

不要選我當版主
2015-03-11 02:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
這個代碼沒用什麽特殊的東西,2008應該可以的。貼出來的,留有一些舊方案的痕跡,比如個別參數沒用,有空我抹了再貼一份。

btw: CLR托管程序執行的特點,第一次時會稍慢,但反復執行的程序卻是快許多的。這種現象的特點是即時編譯,第一次時針對機器環境編譯及優化,但機器檢測和優化衹要一次即可完成,之後編譯過的目標代碼是駐留在內存中的,加上之前針對性的優化,故第二次開始執行的速度快很多,相對非托管程序沒有針對特定機器的普遍優化來説,這種優化方式針對性強,效率反而高一點。


[ 本帖最后由 TonyDeng 于 2015-3-11 12:59 编辑 ]

授人以渔,不授人以鱼。
2015-03-11 12:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
貼一份整理過的:
程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using namespace wube_01
{
    class Program
    {
        static internal Int32 TitleLines;
        static internal List<StringBuilder> TargetData = new List<StringBuilder>();

        static internal void Main(String[] args)
        {
            String programFileName = Path.GetFileNameWithoutExtension(Environment.GetCommandLineArgs()[0]);

            if ((args.Length < 3) || !Int32.TryParse(args[2], out TitleLines))
            {
                ShowTips(programFileName);
                return;
            }

            String targetFileName = args[0];
            String sourceDataPath = args[1];
            String[] files = Directory.GetFiles(sourceDataPath);
            for (Int32 index = 0; index < files.Length; ++index)
            {
                Console.SetCursorPosition(0, 0);
                Console.WriteLine("正在處理{0},請稍候...", Path.GetFileName(files[index]));
                Merger(files[index]);
            }
            WriteOutputFile(targetFileName);

            Console.Write("按回車鍵結束程序...");
            Console.ReadLine();
        }

        // 顯示命令行語法幫助
        static internal void ShowTips(String programFileName)
        {
            Console.WriteLine("格式: {0} 輸出文檔名 \"數據源文檔所在路徑\" 標題行數", programFileName);
            Console.WriteLine("例: {0} AAAA.csv \"Data\" 6", programFileName);
            Console.WriteLine("    數據源文檔放在當前目錄的子目錄Data中,標題佔用6行");
        }

        // 合併兩個文檔
        static internal void Merger(String sourceFileName)
        {
            StreamReader sourceReader = (new FileInfo(sourceFileName)).OpenText();
            Int32 index = 0;
            while (!sourceReader.EndOfStream)
            {
                String sourceLine = sourceReader.ReadLine();
                if (index >= TargetData.Count)
                {
                    TargetData.Add(new StringBuilder(sourceLine));
                }
                else
                {
                    TargetData[index].Append(sourceLine);
                }
                ++index;
            }
            sourceReader.Close();
        }

        // 寫最終輸出文檔
        static internal void WriteOutputFile(String fileName)
        {
            StreamWriter targetWriter = (new FileInfo(fileName)).CreateText();
            foreach (StringBuilder line in TargetData)
            {
                targetWriter.WriteLine(line);
            }
            targetWriter.Close();
        }
    }
}


收到的鲜花
  • wube2015-03-12 11:41 送鲜花  10朵   附言:好文章

授人以渔,不授人以鱼。
2015-03-11 13:01
快速回复:CSV合并的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017965 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved