| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3243 人关注过本帖, 1 人收藏
标题:CSV合并的问题
取消只看楼主 加入收藏
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
C#還OK,反正公司有人會。反而比較冷門沒人會。

不要選我當版主
2015-03-10 21:30
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
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
我先貼上一版的代碼,版主有空幫看看哪裡會導致內存資料會被覆蓋的問題.新版的還沒寫完.
StdAfx.h
程序代码:
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__3652E740_3773_441A_9233_942284587DB6__INCLUDED_)
#define AFX_STDAFX_H__3652E740_3773_441A_9233_942284587DB6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define WIN32_LEAN_AND_MEAN        // Exclude rarely-used stuff from Windows headers

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <time.h>
#include <io.h>
#include <sys/stat.h>

#define IC 1024//16384
#define A 2048
#define B 1024
#define C 8
#define Max_Size 256
#define Min_Size 32

extern char FileList[Max_Size][Max_Size];
extern unsigned int FileCount;
extern float TestResult[IC][B];
extern int My_Max_x;
extern int My_Max_y;
extern int My_Min_x;
extern int My_Min_y;
extern int ErrorCoord;
extern time_t start_tm,finish_tm;

#define Test_policy "Never merge tests with identical test number if test name not matching"
#define Outlier_removal "None (keep all data)"
#define Statistics_computation "From samples data (if any)- otherwise from summary"
#define Binning_computation "From summary data (if any)- otherwise from samples"
#define Cp_Cpk_computation "Use standard Sigma formula"
#define Mean_drift_formula "Percentage of value drift"
#define Parts_processed "All Data / parts (any Bin)"
#define Data_from_Site "All sites"

#define FOREGROUND_WHITE (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)

// TODO: reference additional headers your program requires here

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__3652E740_3773_441A_9233_942284587DB6__INCLUDED_)


stdafx.cpp
程序代码:
// stdafx.cpp : source file that includes just the standard includes
//    Analysis.pch will be the pre-compiled header
//    stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file

char FileList[Max_Size][Max_Size]={0};
unsigned int FileCount=0;
float TestResult[IC][B]={0};
int My_Max_x=0;
int My_Max_y=0;
int My_Min_x=0;
int My_Min_y=0;
time_t start_tm=0;
time_t finish_tm=0;
int ErrorCoord=0;

不要選我當版主
2015-03-11 20:52
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
太長貼不上來.
111.rar (10.01 KB)

不要選我當版主
2015-03-11 20:54
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
C#也太方便了吧~都不用事先聲明陣列大小就會自動增長~
作弊阿~簡直是作弊阿~
图片附件: 游客没有浏览图片的权限,请 登录注册


已經比VB還要逆天了~

[ 本帖最后由 wube 于 2015-3-11 22:19 编辑 ]

不要選我當版主
2015-03-11 22:18
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
其實關鍵就是,到內存串接後一次輸出,照這思路,我也能改寫成VB版。
用的指令都還蠻淺顯易懂的,而且看得出不是VC6的,因為指令後有_S,
記得是.NET版修改用以增加程式運作安全性的。

不過寫法感覺大致上跟我寫的方式差不多。哈....

[ 本帖最后由 wube 于 2015-3-12 05:25 编辑 ]

不要選我當版主
2015-03-12 05:23
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
仿T大的VB6版本...

程序代码:
Option Explicit

Dim TargetFileName As String, SourceFolder As String
Dim FileNameArray() As String, Tmp() As String

Private Const FileType = ".csv"

Sub Main()
Dim TempString As String, Temp() As String, Temp1() As String

    If Trim$(Command) <> "" Then
        Temp = Split(Command, " ")
        If UBound(Temp) = 1 Then
        
            TargetFileName = Trim$(Temp(0))
            SourceFolder = IIf(Right(Trim$(Temp(1)), 1) = "\", Trim$(Temp(1)), Trim$(Temp(1) & "\"))
            
            If ((IsFolderExist(SourceFolder) = True) And (Right$(TargetFileName, 4) = FileType)) Then
                If GetFileList(SourceFolder) > 0 Then
                    Call MergeCSV
                    Call OutputData(TargetFileName)
                    MsgBox "OK"
                End If
            End If
        Else
            MsgBox "Command Count Error !" & vbCrLf & Command
        End If
    Else
        MsgBox "Command is Empty !"
    End If
    
    Erase FileNameArray, Tmp
    
    End
    
End Sub

Private Function GetFileList(strFolderName As String) As Integer
Dim TempString As String, ExtendName As String
Dim varFSO As Variant, varFolder As Variant, varFile As Variant
Dim i As Integer

    GetFileList = 0: i = 0
    
    Set varFSO = CreateObject("Scripting.FileSystemObject")
    Set varFolder = varFSO.GetFolder(strFolderName)
    
    For Each varFile In varFolder.Files
        TempString = Trim(Mid(varFile, InStrRev(varFile, "\") + 1))
        If InStr(TempString, ".") <> 0 Then
            ExtendName = Trim$(Mid$(TempString, InStrRev(TempString, ".")))
            If UCase$(ExtendName) = UCase$(FileType) Then
                ReDim Preserve FileNameArray(i)
                FileNameArray(i) = varFile
                i = i + 1
            End If
        End If
    Next
    GetFileList = i
    
End Function

Private Sub MergeCSV()
Dim TempString As String
Dim FileNum As Integer, i As Integer, j As Integer
    
    ReDim Tmp(0)
    For i = 0 To UBound(FileNameArray)
        FileNum = FreeFile: j = 0
        Open FileNameArray(i) For Input As #FileNum
            Do While Not EOF(FileNum)
                Line Input #FileNum, TempString
                If i = 0 Then ReDim Preserve Tmp(j)
                Tmp(j) = Tmp(j) & TempString
                j = j + 1
                DoEvents
            Loop
        Close #FileNum
        DoEvents
    Next i
    
End Sub

Private Sub OutputData(TF As String)
Dim FileNum As Integer, i As Integer

    FileNum = FreeFile: i = 0
    Open TF For Output As #FileNum
        For i = 0 To UBound(Tmp)
            Print #FileNum, Tmp(i)
        Next i
    Close #FileNum
    
End Sub

Public Function IsFolderExist(strFolderName As String) As Boolean
Dim varFSO As Variant, TempString As String
    Set varFSO = CreateObject("Scripting.FileSystemObject")
    IsFolderExist = varFSO.FolderExists(strFolderName)
    Set varFSO = Nothing
End Function


不要選我當版主
2015-03-12 10:17
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
回复 61楼 TonyDeng
當然是只有VB應該有的速度

不要選我當版主
2015-03-12 13:03
wube
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:23
帖 子:1820
专家分:3681
注 册:2011-3-24
收藏
得分:0 
以下是引用TonyDeng在2015-3-12 13:24:49的发言:

我後面的C解決實現,理論上是最快的,因爲預先申請了(可按需調整)100M的堆空間爲拼接結果數據所用,而不是像C#方案那樣用動態容器有調整容量的開銷(其實也可以事先申請足夠的空間避免調整),所以執行起來,前者比後者快一點。但這種方案的關鍵處也正在這裏,在低內存機器上,未必可以得到100M的堆空間,那時就需要用磁盤文件了,變得由外設速度決定。

記得我曾經就這個問題,在你以前發過的帖子中提示,說應在內存中把數據整理好再寫盤,你的回應是問題沒那麽簡單。


是阿,預先申請一定會比動態調整快,但是預先申請常遇到,不是不夠就是太多.(C要是慢我就不會用它了)

雖然我不太記得了,不過我的回應應該是針對整個程式,而不只是對單一函式,我之前已經有資料覆蓋的問題.

但如果針對目前合併CSV的部分來說,我確實是已經先在內存整理好再寫出,所以合併時才能少掉很多額外的考慮和處理.
直接暴力合併就能OK的程度.

不過話說回來使用者開個幾GB的二進位檔,又要求要能瞬間完成的話,那只好直接翻桌了.

不要選我當版主
2015-03-12 15:03
快速回复:CSV合并的问题
数据加载中...
 
   



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

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