批處理新手入門導讀[視頻教程]批處理基礎視頻教程[視頻教程]VBS基礎視頻教程
[批處理文件精品]批處理版照片整理器[批處理文件精品]純批處理備份&還原驅動在線第三方下載
返回列表 發帖

[文本處理] 求助批處理隨機抽取文件夾中的txt文件并合并

比如說目錄下有文件夾1,文件夾a,文件夾A,
文件夾1下面有1.txt,2.txt,3.txt
文件夾a下面有a.txt,b.txt,c.txt
文件夾A下面有A.txt,B.txt,C.txt

我想在每個文件夾下面隨機抽取1個文件,運行一次合并成新的1個txt文件,文件夾和里面的內容順序不變,原文件保留。
比如運行一次隨機生成一個2cA的內容或者1bB的內容。
不知道如何實現,懇請大佬幫忙。

回復 1# xudewu


    Windows不允許在同一個目錄下創建文件夾a,文件夾A,系統會認為它們是重名的。
【批處理在線視頻分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公眾號、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我幫忙寫的代碼不需要付錢,不用找我要支付寶或微信賬號。如果一定要給,請到微信群給大家發紅吧。

TOP

回復 2# Batcher
學到了,這個也只是舉個例子,為了說明文件夾名稱的區別以及排序,實際應用時不是這個名稱的。
把文件夾名稱改改成文件夾1,文件夾2,文件夾3呢?不知以上如何實現。

TOP

回復 3# xudewu
說一說思路:
1.用for循環取得文件名并進行編號;
2.循環體外用%random%取得隨機編號,在三個文件夾中按隨機編號分別抽取其中一個文件;
3.合并抽取文件。

TOP

回復 1# xudewu


請參考Q-04和Q-05把bat文件和txt文件都保存為ANSI編碼:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "MergeFile=All.txt"
  4. >"%MergeFile%" type nul
  5. for %%a in ("a" "b" "c") do (
  6.     pushd %%a
  7.     for /f "delims=" %%i in ('dir /b /a-d') do (
  8.         set "_%%~nxa_!random!=%%~nxa\%%i"
  9.     )
  10.     for /f "tokens=2 delims==" %%i in ('set _%%~nxa') do (
  11.         set "RandFile=%%i"
  12.     )
  13.     popd
  14.     >>"%MergeFile%" type "!RandFile!"
  15.     >>"%MergeFile%" echo,
  16. )
復制代碼
擴展閱讀:批處理生成隨機數字和隨機字符串
https://mp.weixin.qq.com/s/D6AfUmKYm4DoD_KeazGHdA
【批處理在線視頻分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公眾號、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我幫忙寫的代碼不需要付錢,不用找我要支付寶或微信賬號。如果一定要給,請到微信群給大家發紅吧。

TOP

回復 1# xudewu


第二種思路
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "MergeFile=All.txt"
  4. >"%MergeFile%" type nul
  5. for %%a in ("a" "b" "c") do (
  6.     pushd %%a
  7.     set n=0
  8.     for /f "delims=" %%i in ('dir /b /a-d') do (
  9.         set /a n+=1
  10.         set "_!n!=%%~nxa\%%i"
  11.     )
  12.     set /a RandNum=!random!%%^(3-1+1^)+1
  13.     call set "RandFile=%%_!RandNum!%%"
  14.     popd
  15.     >>"%MergeFile%" type "!RandFile!"
  16.     >>"%MergeFile%" echo,
  17. )
復制代碼
1

評分人數

【批處理在線視頻分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公眾號、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我幫忙寫的代碼不需要付錢,不用找我要支付寶或微信賬號。如果一定要給,請到微信群給大家發紅吧。

TOP

回復 1# xudewu

如果要從當前目錄下所有一級文件夾中分別隨機抽取一個文件(txt),進行合并,而不是指定的三個文件夾的話,可以這樣:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /d %%i in (*) do (
  4.   set /a n=0
  5.   for %%a in ("%%i\*.txt") do (set /a n+=1 & set r!n!=%%~fa)
  6.   set /a s=!random!%%!n!+1
  7.   call set "Stochastic=%%r!s!%%"
  8.   type "!stochastic!">>all.txt
  9. )
  10. pause
復制代碼
1

評分人數

    • xudewu: 感謝給帖子標題標注[已解決]字樣技術 + 1

TOP

回復 6# Batcher


    非常完美,感謝感謝

TOP

回復  xudewu

如果要從當前目錄下所有一級文件夾中分別隨機抽取一個文件(txt),進行合并,而不是指定 ...
qixiaobin0715 發表于 2020-9-17 16:45



    也很實用,所有文件夾提取本來擔心組合好的文檔排序問題,測試了一下用字母把文件夾排好序效果也不錯。

TOP

20200812
20200812data.txt
20200812lisidata.txt
20200812wangwudata.txt
20200812dongyitable.txt
20200812lintable.txt
、、、、
、、、
20200915
20200915liwutable.txt
20200915chendata.txt
20200915lintttable.txt

20200812為文件夾 *.txt的為文件。需要把從20200812文件夾名稱開始到20200915結束文件夾下所有的table.txt結尾的文件 輸出到onlinetale.txt文件中,data.txt結尾的文件輸出到onlinedata.txt


test1.bat
  1. @echo off
  2. type nul >"onlinetale.txt"
  3. type nul >"onlinedata.txt"
  4. for /f "delims=" %%i in ('dir /b /ad') do (
  5.     dir /b /a-d "%%i\*table.txt" >>"onlinetale.txt"
  6.     dir /b /a-d "%%i\*data.txt" >>"onlinedata.txt"
  7. )
復制代碼
test2.bat
  1. @echo off
  2. type nul >"onlinetale.txt"
  3. type nul >"onlinedata.txt"
  4. for /f "delims=" %%i in ('dir /b /ad') do (
  5.     (for /f "delims=" %%j in ('dir /b /a-d "%%i\*table.txt"') do (
  6.         type "%%j"
  7.     ))>>"onlinetale.txt"
  8.     (for /f "delims=" %%j in ('dir /b /a-d "%%i\*data.txt"') do (
  9.         type "%%j"
  10.     ))>>"onlinedata.txt"
  11. )
復制代碼
【批處理在線視頻分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公眾號、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我幫忙寫的代碼不需要付錢,不用找我要支付寶或微信賬號。如果一定要給,請到微信群給大家發紅吧。

TOP

回復 6# Batcher

對于pushd,popd命令一直很迷茫。就知道用pushd標記路徑,然后popd恢復路徑。
就這里來說吧
1.“pushd %%a”標記的是當前目錄的路徑還是當前目錄下的一級目錄的路徑?
2.popd前面的位置路徑發生了什么變化?為什么要恢復路徑?

TOP

回復 11# qixiaobin0715


看下這個教程是否可以理解
http://bbs.bathome.net/thread-13988-1-1.html
【批處理在線視頻分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公眾號、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我幫忙寫的代碼不需要付錢,不用找我要支付寶或微信賬號。如果一定要給,請到微信群給大家發紅吧。

TOP

本帖最后由 qixiaobin0715 于 2020-9-18 18:00 編輯

回復 12# Batcher

仔細進行學習,好像明白了一些。
1.“pushd %%a”標記了當前目錄的下一級目錄的路徑(也即是內部循環體的路徑)?
2.里面的for循環得到的"_!n!=%%~nxa\%%i"只是文件名及擴展名。跳出循環后,"%%_!RandNum!%%"要想和"_!n!=%%~nxa\%%i"關聯,就需要回到上面標記的路徑。
不知這樣理解的是否正確?

TOP

回復 13# qixiaobin0715


    有一小部分不太準確,"_!n!=%%~nxa\%%i"藍色是文件名及擴展名,紅色是文件夾名
【批處理在線視頻分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公眾號、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我幫忙寫的代碼不需要付錢,不用找我要支付寶或微信賬號。如果一定要給,請到微信群給大家發紅吧。

TOP

回復 14# Batcher

確實理解還是有偏差,多虧提醒:
1.外部for循環第一次標記" pushd %%a" 的路徑是 "當前目錄\a\" ,內部的 "for /f" 循環默認在 "當前目錄\a\" 運行,就不再需要指定路徑。
2.下面popd恢復路徑后,回到了 "當前目錄\" ,又要與子文件夾"a\"下的文件關聯,所以內部循環賦值時要在文件名前面加上子文件夾名,即"%%~nxa\%%i"。

TOP

返回列表
重庆时时开奖直播软件