首页 > 解决方案 > 笛卡尔积或 2 个大文本文件的最佳方法

问题描述

我想将 2 个大文本文件合并在一起并使用 2 个输入文件的笛卡尔积生成新文件时遇到问题。我确实知道代码的外观,但不确定用哪种语言构建这样的实用程序。我有 Windows 服务器,我熟悉 C#、Shell 脚本。

注意:File1 可以大约 20 MB,而 File2 可以包含大约 6000 条记录。所以我想要实现的是在新文件中复制 20MB 数据 6000 次。

以下是我的文件外观的较小示例

文件 1

Head-A-AA-AAA
Child-A1-AA1-AAA1
Child-A2-AA2-AAA2
Child-A3-AA3-AAA3
Head-B-BB-BBB
Child-B1-BB1-BBB1
Child-B2-BB2-BBB2
Child-B3-BB3-BBB3

文件2

Store1
Store2
Store3

预期的输出文件

Store1
Head-A-AA-AAA
Child-A1-AA1-AAA1
Child-A2-AA2-AAA2
Child-A3-AA3-AAA3
Head-B-BB-BBB
Child-B1-BB1-BBB1
Child-B2-BB2-BBB2
Child-B3-BB3-BBB3
Store2
Head-A-AA-AAA
Child-A1-AA1-AAA1
Child-A2-AA2-AAA2
Child-A3-AA3-AAA3
Head-B-BB-BBB
Child-B1-BB1-BBB1
Child-B2-BB2-BBB2
Child-B3-BB3-BBB3
Store3
Head-A-AA-AAA
Child-A1-AA1-AAA1
Child-A2-AA2-AAA2
Child-A3-AA3-AAA3
Head-B-BB-BBB
Child-B1-BB1-BBB1
Child-B2-BB2-BBB2
Child-B3-BB3-BBB3

寻找带有 Windows 服务的 C# 代码是否可以达到目的或者我需要使用任何其他工具/实用程序/脚本的建议?

编辑:在 c# 代码下创建。但是生成 150 GB 的输出文件需要几个小时。我正在寻找更快的方法。我正在从文件 1 中获取内容并为第二个文件中的每条记录复制它

FileInfo[] fi;
            List<FileInfo> TodaysFiles = new List<FileInfo>();
            string PublishId;
            DirectoryInfo di = new DirectoryInfo(@"\\InputPath");

            fi = di.GetFiles().Where(file => file.FullName.Contains("TRANSMIT_MASS")).ToArray();

            foreach (FileInfo f in fi)
            {
                string[] tokens = f.Name.Split('_');
                if(tokens[2] == DateTime.Now.AddDays(1).ToString("MMddyyyy"))
                {
                    PublishId = tokens[0];
                    string MACSFile = @"\\OutputPath\\" + PublishId + ".txt";
                    string path =f.FullName;

                    string StoreFile = di.GetFiles().Where(file => file.Name.StartsWith(PublishId) && file.Name.Contains("SUBS")).Single().FullName;

                    using (FileStream fs = File.Open(StoreFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    using (BufferedStream bs = new BufferedStream(fs))
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        using (StreamWriter outfile = new StreamWriter(MACSFile))
                        {
                            String StoreNumber;
                            while ((StoreNumber = sr.ReadLine()) != null)
                            {
                                Console.WriteLine(StoreNumber);
                                if (StoreNumber.Length > 5)
                                {
                                    using (FileStream fsProfile = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                                    using (BufferedStream bsProfile = new BufferedStream(fsProfile))
                                    using (StreamReader srProfile = new StreamReader(bsProfile))
                                    {
                                        outfile.WriteLine(srProfile.ReadToEnd().TrimEnd());
                                        
                                    }

                                }

                            }
                        }
                    }

                }
            }

标签: c#.netwindowsfilestreamlarge-files

解决方案


你提到了shell脚本。这是一个工作外壳示例:

while read line; do
  echo "$line" >> Output
  cat File1 >> Output
done < File2

在这里, 的行File2被循环并连同整个 的File1写入到任意输出文件Output中。

通过将其保存在本地文件中something.sh并运行sh something.sh.


推荐阅读