用C语言写的合并BOM和坐标文件的小工具

66 篇文章 24 订阅
58 篇文章 28 订阅
该博客分享了一个C++程序,用于解决ALLEGRO PCB设计软件生成的坐标文件缺少原件参数的问题。作者通过读取BOM单并将参数添加到坐标文件中,创建了一个新的合并文件。程序虽然效率不高,但对于小规模文件,时间消耗可以接受。博客还提供了源代码和示例文件下载链接。
摘要由CSDN通过智能技术生成

ALLEGRO画PCB的软件生成的坐标文件里面没有原件的参数数值,比如没有电容容量,电阻阻值。如下图:

 焊接厂生产的时候希望我在里面加上原件参数。我这边反复看了ALLEGRO设置,都无法在同一个文件输出左边文件和原件参数。

要想可口,自己动手。我琢磨自己合并一下。打算和BOM单合并一下就可以了。基本思路就是从BOM单只提取原件标号和参数,保存成一个bom文件。之后程序遍历坐标文件每一行,处理每一行时候,找到标号之后从bom里面根据标号找到参数,之后将见参数加到这一行就OK。

我们将BOM文件精简的只有两列,.BOM单一般是电子表格,我们删除无关列并且调整位置成为一下样子:

 之后保存成我们能识别和解析的文本文件,

 

另存为.csv文件。我们用文本编辑软件打开这个csv文件看到是这样的

 这里面我们看到用逗号来间隔每个字段,如果字段本身中有逗号就将此字段内容加引号。

接下来我们编写程序,合并这两个文件。代码如下:

#include "stdio.h"
 
static int strncmp(char *a,char *b,int len ){
    int i ;
    for(i=0;i<len;++i)  if (a[i]!=b[i]) return 0;
    return 1 ;
    }
    
    
int strfind(char *word,char *line){
    int r , i, word_len ,line_len ; 
    r=0;
  //  printf("strfind<%s> in <%s>\n",word,line);
    
    word_len = strlen (word);
    line_len = strlen (line);
    for (i=0;i<line_len;++i)if ( strncmp(word,line+i,word_len) == 1 )  r = 1;
//    printf("strfind result is %d \n",r );
   // getchar();
    return r ;
    }
   
char * find_value (char * line){
    static  char buf[100] ; 
    int i,line_len ,t; 
    for(i=0;i<100;++i)  buf[i] = 0 ; 
    i = line_len = strlen (line);
    printf("line len is %d\r\n",i);  //getchar () ;
    while( i ) { 
        if (line[i] == ',') break;
        i--;
        }
        if (i==0) return NULL;
        t = 0 ;
        i++;
        if(line[i]==' ') i++;
    for(;i<line_len;++i) 
    {
        if (line[i] ==0x00)  break; 
        if (line[i] ==0x0d)  break; 
        if (line[i] ==0x0a)  break; 
        buf[t++] = line[i] ;
    }
    return buf ;
}


char * get_name (char * line ){
    static char  buf[10];
    int i ;
    for(i=1;i<10;++i)buf[i]=0; 
    for(i=1;i<10;++i) if( line[i] == ' ' ) break ;
    if (i==10) return NULL;
    memcpy (buf,line,i);
    return buf;
}





char * search_value (char *lable ){ 
     FILE *fp;
     int i ,t ,r;
   static char str[1024],*p;
p=NULL;
   /* opening file for reading */
   fp = fopen("bom.csv" , "r");
   if(fp == NULL) {
      perror("Error opening file");
      return(NULL);
   }
   while( fgets (str, 1024, fp)!=NULL ) {
      puts(str);
     r = strfind(lable,str);
       if (r){ 
     //       printf("find a item in BOM !\n");
            p =  find_value(str);
            puts(p);
       //     printf("is it ok?");
       //     getchar();
            break;
            }
   }
   fclose(fp);
   return(p);
}
     

char * format_value (char *p){
    static char buf[1200] ;
    buf[0] = 0 ;
    strcpy(buf,p) ;
    strcat(buf,"                                                  ");
    buf[30] = 0 ;                                                
    buf[25] = '!';
    return buf ;
    }
    
int main  () {
   FILE *fp;
   FILE *ft;
   char str[1024],*p;
   char *rp ;

   /* opening file for reading */
   fp = fopen("place.txt" , "r");

   if(fp == NULL) {
      perror("Error opening input file");
      return(-1);
   }
   
   
   ft = fopen("place_bom.txt" , "w");
      
   if(ft == NULL) {
      perror("Error opening output file");
      return(-1);
   }
   
   while( fgets (str, 1024, fp)!=NULL ) {
      /* writing content to stdout */
      puts(str);
       p = get_name(str);
       
       if (p){
       rp = search_value(p);
       if (rp==NULL) printf("<%s>not found",p); 
       if (rp==NULL)rp = format_value("NC");
       else rp = format_value(rp);  
       strcat(rp,str);
       fputs(rp,ft);
       }
   }
   fclose(fp);
   fclose(ft);
   getchar();
   return(0);
}



这个文件打开bom.txt和palce.txt并生成新的place_bom.txt文件,生成的文件内包含了原件的参数,如下所截图:

 

红色部分就是添加上的。

运行的时候你发现合并俩不大的文件需要十来秒的时间量级,原件执行效率很低的,因为是算法写的时候就“”偷懒”了,没有对BOM文件读到数组进行缓冲,而是每一次搜索都是打开bom.txt文件遍历一次,place.txt有n个条目就要打开n次bom.txt文件。不过10来秒时间咱们用户不在乎,电脑不会说话咱也不知道是否在乎,那就这样吧,无所谓了。

希望这个工具对大家有用,上述几个文件我压缩放在本文尾部的链接。其中bom.txt和place.txt分别是bom文件和坐标文件,palce_bom.txt是运行bom_palce_merge.exe产生的结果。其中bom_place_merge.c就是本文所贴源码。

 链接:https://pan.baidu.com/s/1Wze_eHSBRE4t_TcI31QtMg 
提取码:guuo  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值