c# - 笛卡尔积或 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());
}
}
}
}
}
}
}
解决方案
你提到了shell脚本。这是一个工作外壳示例:
while read line; do
echo "$line" >> Output
cat File1 >> Output
done < File2
在这里, 的行File2
被循环并连同整个 的File1
写入到任意输出文件Output
中。
通过将其保存在本地文件中something.sh
并运行sh something.sh
.
推荐阅读
- python - 在pyqt5中设置禁用复选框的选择背景
- c# - -AWS C# .Net Core-如何将 .jpg 图像上传到 S3 存储桶而不将其保存为文件
- python - 用另一列的条件模式填充列
- r - 带有 nginx 和 https 的闪亮服务器:应用程序的 404
- php - laravel 5.8 直接导航链接和重定向路由问题
- python - OSError:找不到 geos_c.dll 或加载其任何变体
- python-3.x - 如何为整个集合转换带有 int 字符的字符串?
- spring-cloud - 有没有办法防止 Spring Cloud Gateway 重新排序查询参数?
- javascript - 如何将这些过滤器按钮更改为下拉菜单?
- sql - tab_to_string [Error] 执行 (37: 13): ORA-06502: PL/SQL: numeric or value error: 字符串缓冲区太小