2015-06-16 53 views
-1

我試圖讓電子證書分發爲我上大學的事件之一。我使用Photoshop來生成具有不同名稱和卷號的批量證書。現在,這些文件被命名爲core_01Data集1.JPGcore_02Data集2.JPG,等。爲了發佈到網上,他們需要重新命名和排序WRT與會者的姓名。 我有一個.txt文件,其中包含參與者名稱,卷號和大學名稱(以製表符分隔的格式)。我需要根據.txt文件的內容重命名文件。我嘗試了一下,但不能走得太遠。請幫忙。如何使用文本文件的內容(製表符分隔格式)重命名文件夾中的文件?

#include<stdio.h> 
#include<dirent.h> 
int main() 
{ 
    FILE *fp; 
    char arr[3][20][40]; 
    int i=0; 

    char final_name[19][50]={0}; 

    fp = fopen("./new/core.txt", "r"); 
    while(fgetc(fp)!=EOF) 
    { 
    while(fgetc(fp)!='\n' && i<20) 
    { 
     fscanf(fp,"%s%s%s", arr[0][i], arr[1][i], arr[2][i]); 
     i++; 
    } 
    } 

    i=1; 
    while(i<20) 
    { 
     strcat(final_name[i-1], arr[0][i]); 
     strcat(final_name[i-1], "_"); 
     strcat(final_name[i-1], arr[1][i]); 
     strcat(final_name[i-1], "_"); 
     strcat(final_name[i-1], arr[2][i]); 
     printf("%s\n", final_name[i-1]); 
     i++; 
    } 
    char name[19][50]={0}; 
    char buf[19][50]={0}; 

    for(i=1; i<20; i++) 
    { 
     if(i<10) 
     { 
      sprintf(buf[i-1], "core_0%d_Data Set %d", i, i); 
     } 
     else 
     { 
      sprintf(buf[i-1], "core_%d_Data Set %d", i, i); 
     } 

     printf("%s...\n", buf[i-1]); 
     name[i-1]=buf[i-1]; 
    } 

    i=0; 
    DIR *d; 
    struct dirent *dir; 
    d = opendir("./new/"); 
    if (d) 
    { 
     while ((dir = readdir(d)) != NULL) 
     { 
      printf("%s\n", dir->d_name); 
      if (strcmp(dir->d_name, buf[i]) == 0) 
      { 
       rename(dir->d_name, final_name[i]); 
       i++; 
      } 
     } 
     closedir(d); 
    } 
} 

鏈接的文件:https://goo.gl/S6B3AB

+1

爲什麼要在C中嘗試這樣做?只需使用任何簡單的腳本語言。如果不是Windows,我會建議使用shell,但仍然可以輕鬆地在python或perl(對於windows存在)中執行此操作。我敢肯定,PowerShell中也能工作,雖然我不是太熟悉 –

+0

我更熟悉C和C++,因此決定與他們往前走。有關該計劃的任何幫助? –

回答

0

,如果你願意,你可以使用PowerShell。我認爲這會奏效。

$names = (gc core.txt) 
$idx = 1 

gci core*.jpg | %{ 
    $newname = $names[$idx++].trim().split("`t")[0] + ".jpg" 
    ren $_ $newname 
} 

編輯:這是一個分割的標籤core.txt的每一行,返回的第一個元素這

.trim().split("`t")[0] 

一部分。如果你想包括其他列,請試試這個:

$names = (gc core.txt) 
$idx = 1 

gci core*.jpg | %{ 
    $newname = ($names[$idx++].trim() -replace "`t+","-") + ".jpg" 
    ren $_ $newname 
} 
+0

非常感謝,我第一次嘗試Powershell,它的工作。你能否告訴我如何將** roll no **和** college name **添加到重命名的文件中?我是Powershell中的第一個計時器。 下面是最新的屏幕截圖:https://drive.google.com/open?id=0B55XWlRkXur3VXIwNHJwVXYwU3c&authuser=0 –

+0

@PayayushBhardwaj查看修改。我們現在用一個破折號替換一個或多個連續製表符的每個實例,而不是在製表符上分割。如果你用這個教你自己的PowerShell,我使用的一些命令是簡寫別名。 'gc'表示'get-content'。 'gci'意思是'get-childitems'。 '%'表示'foreach-item'。 'ren'的意思是'重命名項目'。 PowerShell的語法與C和C++有很大不同,因爲它經常將一個命令的結果輸入到另一個命令的輸入中 - 「get-childitems core * .jpg |例如,foreach-item {do stuff}。 – rojo

+0

非常感謝先生。這個方法確實有幫助。 –

0

只給你一個方法來了解你做錯了什麼見下文

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

int main(int argc, char **argv) 
{ 
    FILE *fp; 
    char arr[3][20][40]; 
    int i=0; 
    int numberOfNames = 0; 

    fp = fopen("a.txt", "r"); 

    // read until fscanf can get 3 items from file considering tabs as space between strings 
    while((fscanf(fp,"%s\t%s\t%s", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]) == 3) && (numberOfNames<20)) 
    { 
     printf("%s %s %s\n", arr[0][numberOfNames], arr[1][numberOfNames], arr[2][numberOfNames]); 
     numberOfNames++; 
    } 

    // this init only the first string with null termination 
    char final_name[20][50]={0}; 
    //This init the whole matrix 
    memset(final_name, 0, 1000); 

    i=0; 
    while(i<numberOfNames) 
    { 
     strcat(final_name[i], arr[0][i]); 
     strcat(final_name[i], "_"); 
     strcat(final_name[i], arr[1][i]); 
     strcat(final_name[i], "_"); 
     strcat(final_name[i], arr[2][i]); 
     printf("%s\n", final_name[i]); 
     i++; 
    } 

    char name[19][50]={0}; 
    char buf[19][50]={0}; 

    for(i=1; i<=numberOfNames; i++) 
    { 
     // Using %02d format you grants that the output is always with 2 digit at least and padded with 0 
     sprintf(buf[i-1], "core_%02d_Data Set %d", i, i); 

     printf("%s...\n", buf[i-1]); 
     // sprintf is the way to copy a string into another string 
     // You cannot simply name[i-1]=buf[i-1]; 
     sprintf(name[i-1],buf[i-1]); 
     printf("%s\n", buf[i-1]); 
    } 
} 
0

的代碼,你可以使用Python,如果你想

#!/usr/bin/python 
import string,os 

f=open("in.txt") 
a=f.readlines(); 

for x in a: 
     x=x[:-1] 
     r=string.split(x,",") 
     os.rename(r[0],r[1]) 
+0

其簡短。 (Y) –

+1

這個問題在C中提供了答案,而不是Python。 – JAL

+0

這是一個建議使用Python和用戶did'nt說c是必需的。此外..批准的答案是在powershell –

相關問題