0

我正在尝试编写一个程序,该程序将比较两个或多个 CSV 文件并找到相同的名称并在有两个或多个时将它们打印出来。每个名称只会在一个文件中出现一次。

这是典型文件的外观。

Name,E-mail,Student Level,Major
John Doe, jdoe@something.com, Freshman, CS
Jane Doe, janed@something.com, Freshman, CS
....

因此,如果这些名称中的任何一个在两个或多个文件中,程序应该打印出他们的名字和他们的名字出现在文件中的总次数。

到目前为止,我已经做了很多。我已经让它只打印出一个文件中的名称。不知道下一步该做什么。这是代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define buffer 1024

int main(){
    FILE *fp;
    char temp[buffer], *fn, *ln;
    char *first[buffer], *last[buffer];
    int line_count = 0;
    fp = fopen("students.csv", "r");

    while( (fgets(temp, buffer, fp) != NULL) )
    {
            first[line_count] = (char *)malloc(sizeof(char)* buffer);
            last[line_count] = (char *)malloc(sizeof(char) * buffer);

            ln = strtok(temp,",");
            fn = strtok(NULL,",");
            strcpy(first[line_count], fn);
            strcpy(last[line_count], ln);
            line_count++;
    }

    while(line_count--)
    {
            printf("Name : %s %s\n", first[line_count], last[line_count]);
    }

    fclose(fp);
    return 0;
}

我是 C++ 新手(因此我用 C 编写代码),所以如果有人能指出我正确的方向。那很好啊。谢谢你。

4

2 回答 2

1

当您从 CSV 输入文件中读取每个名称时,您应该尝试将其插入到std::set<std::string>(您需要#include <set>and #include <string>。如果由于密钥已经存在而失败,您知道该名称是您的输出之一。

于 2013-01-30T07:58:30.647 回答
0

因为看起来您只是在寻找一种方法而不是代码(您已经喜欢编写 C)。那么这是一个使用你已经拥有的“方法”。

由于您已经成功解析了一个文件,只需对另一个文件重复该过程(复制、粘贴、更改一些名称等)。

然后你将有两组数组,比如 first1、first2、last1、last2。现在您可以通过它们来查找任何匹配项(下面的 sudo 代码)。

for each line in first1 and last2
  look for match in first2 and last2
  log/print the matches

现在就你如何处理它而言,我肯定会推荐更多的 C++ ish 代码。您可以利用 std::string 和 std::vector 功能来简化代码。

于 2013-01-30T08:22:25.180 回答