- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有 2 个 csv 文件
1.csv
spain;russia;japan
italy;russia;france
2.csv
spain;russia;japan
india;iran;pakistan
我读取两个文件并将数据添加到列表
var lst1= File.ReadAllLines("1.csv").ToList();
var lst2= File.ReadAllLines("2.csv").ToList();
然后我从两个列表中找到所有唯一的字符串并将其添加到结果列表中
var rezList = lst1.Except(lst2).Union(lst2.Except(lst1)).ToList();
rezlist 包含这些数据
[0] = "italy;russia;france"
[1] = "india;iran;pakistan"
现在我想通过所有行中的second 和third 列来比较、生成except 和union。
1.csv
西类牙;俄罗斯;日本
意大利;俄罗斯;法国
2.csv
西类牙;俄罗斯;日本
印度;伊朗;巴基斯坦
我想我需要用符号 ';' 拆分所有行并进行所有 3 操作(except、distinct 和 union)但无法理解如何操作。
rezlist
必须包含
india;iran;pakistan
我添加了类
class StringLengthEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
...
}
public int GetHashCode(string obj)
{
...
}
}
StringLengthEqualityComparer stringLengthComparer = new StringLengthEqualityComparer();
var rezList = lst1.Except(lst2,stringLengthComparer ).Union(lst2.Except(lst1,stringLengthComparer),stringLengthComparer).ToList();
最佳答案
您的问题不是很清楚:例如,india;iran;pakistan
是否是期望的结果,主要是因为 russia 位于 element[1]?不也是因为元素[2]pakistan没有匹配到france和japan吗?尽管还不清楚,但我认为无论哪种情况都会产生预期的结果。
然后是这样的:从两个列表中找到所有唯一的字符串
,它极大地改变了性质。所以,我认为期望的结果是因为“iran”出现在列 [1] 中,没有出现在任何文件的列 [1] 中的其他地方,即使它出现了,由于 col 中的“pakistan”,该行仍然是唯一的[2].
另请注意,2 的数据样本为相当多的错误留下了空间。
尝试一步完成会让人非常困惑。由于消除在 1.CSV 中发现的重复项非常容易,因此请先执行此操作:
// parse "1.CSV"
List<string[]> lst1 = File.ReadAllLines(@"C:\Temp\1.csv").
Select(line => line.Split(';')).
ToList();
// parse "2.CSV"
List<string[]> lst2 = File.ReadAllLines(@"C:\Temp\2.csv").
Select(line => line.Split(';')).
ToList();
// extracting once speeds things up in the next step
// and leaves open the possibility of iterating in a method
List<List<string>> tgts = new List<List<string>>();
tgts.Add(lst1.Select(z => z[1]).Distinct().ToList());
tgts.Add(lst1.Select(z => z[2]).Distinct().ToList());
var tmpLst = lst2.Where(x => !tgts[0].Contains(x[1]) ||
!tgts[1].Contains(x[2])).
ToList();
这导致项目不在 1.CSV 中(在 Col[1] 和 Col[2] 中没有匹配的文本)。如果这真的是您所需要的,那么您就完成了。
在 2.CSV 中获取唯一行比较棘手,因为您必须实际计算每个 Col[1] 项出现的次数以查看它是否唯一;然后重复 Col[2]。这使用了 GroupBy:
var unique = tmpLst.
GroupBy(g => g[1], (key, values) =>
new GroupItem(key,
values.ToArray()[0],
values.Count())
).Where(q => q.Count == 1).
GroupBy(g => g.Data[2], (key, values) => new
{
Item = string.Join(";", values.ToArray()[0]),
Count = values.Count()
}
).Where(q => q.Count == 1).Select(s => s.Item).
ToList();
GroupItem
类很简单:
class GroupItem
{
public string Item { set; get; } // debug aide
public string[] Data { set; get; }
public int Count { set; get; }
public GroupItem(string n, string[] d, int c)
{
Item = n;
Data = d;
Count = c;
}
public override string ToString()
{
return string.Join(";", Data);
}
}
它以 tmpList
开始,获取在 [1] 处具有唯一元素的行。它使用一个类进行存储,因为此时我们需要数组数据以供进一步审查。
第二个 GroupBy
作用于这些结果,这次查看 col[2]。最后,它选择连接的字符串数据。
在 File1 (1.3 MB) 中使用 50,000 个随机项,在 File2 (390 kb) 中使用 15,000 个。没有自然产生的唯一项,所以我在 2.CSV 中手动制作了 8 个唯一项,并将其中 2 个复制到 1.CSV 中。如果 2.CSV 中的 8 个唯一行使预期结果为 6 个唯一行,则 1.CSV 中的副本应消除 2:
NepalX
和 ItalyX
是两个文件中的重复项,它们正确地相互消除了。
在每一步中,它都在扫描和处理越来越少的数据,这似乎使其对于 65,000 行/130,000 个数据元素的速度相当快。
关于c# - 如何按 2 列比较两个 csv 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39046533/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!