求助:excle中从一对多转换成多对一

门文闵同学M 2021-02-23 02:38:35
求助:excle中从一对多转换成多对一具体图片如下
求大佬帮忙看看,数据量大



具体文件如附件:
...全文
327 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2021-02-24
  • 打赏
  • 举报
回复
// 求助:excle中从一对多转换成多对一
// https://bbs.csdn.net/topics/399070161
//=====输入=====
//book1.csv:
//漏洞,设备
//A,"1,2,3,4,5"
//B,"2,3,4"
//C,"1,4,5,6"
//D,"2,3,5,7,8"
//=====输出=====
//book2.csv:
//设备,漏洞
//1,"A,C"
//2,"A,B,D"
//3,"A,B,D"
//4,"A,B,C"
//5,"A,C,D"
//6,"C"
//7,"D"
//8,"D"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int MAXLS=10000;
struct LS {
    char L[8];
    char S[8];
} LSs[MAXLS],ls;
char l[8];
char s[8];
int main() {
    FILE *fi=fopen("book1.csv","r");
    if (NULL==fi) {
        printf("Can not open file book1.csv\n");
        return 1;
    }
    char ln[80];
    fgets(ln,80,fi);
    char *p=strchr(ln,',');
    char fda[40];
    strncpy(fda,ln,p-ln);fda[p-ln]=0;
    char *q=strchr(p+1,'\n');
    char fdb[40];
    strncpy(fdb,p+1,q-p-1);fdb[q-p-1]=0;
    FILE *fo=fopen("book2.csv","w");
    if (NULL==fo) {
        fclose(fi);
        printf("Can not create file book2.csv\n");
        return 2;
    }
    fprintf(fo,"%s,%s\n",fdb,fda);
    int i=0;
    while (1) {
        if (NULL==fgets(ln,80,fi)) break;
        p=strchr(ln,',');
        strncpy(l,ln,p-ln);l[p-ln]=0;
        q=p+2;
        while (1) {
            p=strchr(q,',');
            if (NULL==p) {
                p=strchr(q,'"');
                if (NULL==p) {
                    printf("Format error in line %d:%s",i+1,ln);
                    fcloseall();
                    return 3;
                }
                strncpy(s,q,p-q);s[p-q]=0;
                strcpy(LSs[i].L,l);
                strcpy(LSs[i].S,s);
                i++;
                if (i>=MAXLS) {
                    printf("Too many lines( >%d lines)\n",MAXLS);
                    fcloseall();
                    return 4;
                }
                break;
            } else {
                strncpy(s,q,p-q);s[p-q]=0;
                strcpy(LSs[i].L,l);
                strcpy(LSs[i].S,s);
                i++;
                if (i>=MAXLS) {
                    printf("Too many lines( >%d lines)\n",MAXLS);
                    fcloseall();
                    return 4;
                }
                q=p+1;
            }
        }
    }
    int n=i;
//  for (i=0;i<n;i++) printf("%s - %s\n",LSs[i].L,LSs[i].S);
    int j;
    for (i=0;i<n-1;i++) {
        for (j=i+1;j<n;j++) {
            if (strcmp(LSs[i].S,LSs[j].S)>0
            || (strcmp(LSs[i].S,LSs[j].S)==0
             && strcmp(LSs[i].L,LSs[j].L)>0)) {
                ls=LSs[i];LSs[i]=LSs[j];LSs[j]=ls;
            }
        }
    }
//  for (i=0;i<n;i++) printf("%s - %s\n",LSs[i].L,LSs[i].S);
    int st=0;
    for (i=0;i<n;i++) {
        if (0==st) {
            strcpy(s,LSs[i].S);
            fprintf(fo,"%s,\"%s",s,LSs[i].L);
            st=1;
        } else if (1==st) {
            if (0==strcmp(s,LSs[i].S)) {
                fprintf(fo,",%s",LSs[i].L);
            } else {
                strcpy(s,LSs[i].S);
                fprintf(fo,"\"\n%s,\"%s",s,LSs[i].L);
            }
        }
    }
    fprintf(fo,"\"\n");
    fcloseall();
    return 0;
}
脆皮大雪糕 2021-02-24
  • 打赏
  • 举报
回复
假设你的数据在A,B列。然后在C,D列输出结果:

Sub test()
    Dim i As Long, j As Long
    Dim tmp() As String
    For i = 2 To ActiveSheet.Range("A2").End(xlDown).Row
        tmp = Split(ActiveSheet.Cells(i, 2).Text, ",")
        For j = LBound(tmp) To UBound(tmp)
            ActiveSheet.Cells(Val(tmp(j) + 1), 3) = Str(tmp(j))
            ActiveSheet.Cells(Val(tmp(j) + 1), 4) = ActiveSheet.Cells(Val(tmp(j) + 1), 4).Text & IIf(ActiveSheet.Cells(Val(tmp(j) + 1), 4).Text = "", "", ",") & ActiveSheet.Cells(i, 1).Text
        Next
    Next
End Sub

不懂别说哎 2021-02-24
  • 打赏
  • 举报
回复
用数组存数据,用Split函数分割,然后按结果要求重新填充
在Excel使用过程,运用一些技巧会使得我们的工作效率提高很多。而这些技巧往往又被忽略或忘记怎么去使用。本套课程基于此整理了一些Excel方面的技巧,这些呢为学习笔记集锦,前后章内容不存在连贯性,仅整理一些常用的技巧与大家分享。【说明:Excel为2013版本,无下载资料,请参看课程视频学习。】l  本课程知识点l  第1节:概述l  第2节:Excel大批量数据自动填写灵活妙用经验分享l  第3节:巧为Excel2013单元格的文本内容增加拼音l  第4节:Excel在单元格内实现自动换行l  第5节:Excel快速使用函数计算不同区域数据l  第6节:Excel单元格超长内容不能显示全巧妙设置l  第7节:巧妙运用之Excel单元格自动快速输入带有小数点的数值l  第8节:Excel巧妙使用回车键快速粘贴l  第9节:职场必会Excel函数经典应用,使用And函数多条件判断l  第10节:Excel函数经典应用之IF函数条件判断范例l  第11节:Excel技巧之巧妙使用不同颜色区分不同类型数据l  第12节:巧妙快速调整Excle所有单元格或局部单元格l  第13节:巧妙快速切换Excel单元格回车后的纵向输入和横向输入l  第14节:巧妙理解记忆Excel公式的相对引用和绝对引用l  第15节:Excel单元格文风快速两端对齐l  第16节:Excel2013文档内容快速居打印l  第17节:excel直接使用模板制作精美格式样式l  第18节: excel使用可以直接使用翻译功能英文互译l  第19节:不需要截图工具直接使用excel复制图片l  第20节:excel粘贴也可以多种方式选择了l  第21节:巧为excel单元格画双划线l  第22节:为excel的文字或数字添加单划线或双划线l  第23节:excel连续微调单元格内容字号的大小l  第24节: 快速的将长文本内容变为自适应多行文本l  第25节:excel多单元格合并居l  第26节:单元格内容连续微调缩进量l  第27节:将文本内容倾斜到任意角度l  第28节:单元格内容多种形式的对齐方式l  第29节:快速将数据转换为会计专用数据l  第30节:快速为数据增加或减少小数位数

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧