Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 将2个大的排序CSV文件合并为一个文件_Sorting_Csv_Go - Fatal编程技术网

Sorting 将2个大的排序CSV文件合并为一个文件

Sorting 将2个大的排序CSV文件合并为一个文件,sorting,csv,go,Sorting,Csv,Go,我有一个大约50GB大小的存档文件 每周,我都要拿出一个CSV文件,并将其与非常大的50GB CSV文件合并 我是新手,希望在围棋中有一个很好的解决方案 这些文件看起来像: "a:123", 101010 "b:123", 101010 "some-key-here:123", 101010 "some-key-here:234", 101010 虽然我没有亲自编译它以进行检查,但一旦您实现了compare()函数,它就应该满足您的要求。它本质上是Mergesort算法的“合并”步骤。由于您已

我有一个大约50GB大小的存档文件

每周,我都要拿出一个CSV文件,并将其与非常大的50GB CSV文件合并

我是新手,希望在围棋中有一个很好的解决方案

这些文件看起来像:

"a:123", 101010
"b:123", 101010
"some-key-here:123", 101010
"some-key-here:234", 101010

虽然我没有亲自编译它以进行检查,但一旦您实现了
compare()
函数,它就应该满足您的要求。它本质上是Mergesort算法的“合并”步骤。由于您已经将这两个文件按顺序排序,因此只需要合并步骤,这可以以流式方式完成

package main

import (
    "encoding/csv"
    "io"
    "log"
    "os"
)

const outFile = "your/output/file/path.ext"

func main() {
    // make sure there are only 2 args
    if len(os.Args) != 3 {
        log.Panic("\nUsage: command file1 file2")
    }

    // open the first file
    f1, e := os.Open(os.Args[1])
    if e != nil {
        log.Panic("\nUnable to open first file: ", e)
    }
    defer f1.Close()

    // open second file
    f2, e := os.Open(os.Args[2])
    if e != nil {
        log.Panic("\nUnable to open second file: ", e)
    }
    defer f2.Close()

    // create a file writer
    w, e := os.Create(outFile)
    if e != nil {
        log.Panic("\nUnable to create new file: ", e)
    }
    defer w.Close()

    // wrap the file readers with CSV readers
    cr1 := csv.NewReader(f1)
    cr2 := csv.NewReader(f2)

    // wrap the out file writer with a CSV writer
    cw := csv.NewWriter(w)

    // initialize the lines
    line1, b := readline(cr1)
    if !b {
        log.Panic("\nNo CSV lines in file 1.")
    }
    line2, b := readline(cr2)
    if !b {
        log.Panic("\nNo CSV lines in file 2.")
    }

    // copy the files according to similar rules of the merge step in Mergesort
    for {
        if compare(line1, line2) {
            writeline(line1)
            if line1, b = readline(cr1); !b {
                copy(cr2, w)
                break
            }
        } else {
            writeline(line2)
            if line2, b = readline(cr2); !b {
                copy(cr1, w)
                break
            }
        }
    }

    // note the files will be closed here, since we defered it above
}

func readline(r csv.Reader) ([]string, bool) {
    line, e := r.Read()
    if e != nil {
        if e == io.EOF {
            return nil, false
        }
        log.Panic("\nError reading file: ", e)
    }
    return line, true
}

func writeline(w csv.Writer, line []string) {
    e := w.Write(line)
    if e != nil {
        log.Panic("\nError writing file: ", e)
    }
}

func copy(r csv.Reader, w csv.Writer) {
    for line, b := readline(r); !b; r, b = readline(r) {
        writeline(w, line)
    }
}

func compare(line1, line2 string) bool {
    /* here, determine if line1 and line2 are in the correct order (line1 first)
       if so, return true, otherwise false
    */
}

注意:此答案经过大量编辑,以包含内联代码而不是链接。此外,自我的初稿以来,代码得到了极大的改进,但由于这里没有任何活动,我只是将旧版本吹走并重写我的答案。

如果两个文件分别排序,则可以使用合并排序的合并功能将它们合并到一个排序数组中


数组,我的意思是我们可以使用另一个CSV文件来写排序数据。在/UNP>如果您在UNIX/LINUX/OSX上,您应该考虑使用<代码>排序< /COD>命令。这项艰巨的工作已经为你完成。问题的标题表明它已被排序。由于文件很大,流式传输比读取数组(可能无法放入内存)更好。