您好:
請問如我有一個csv檔,裡面有3列,每一列的字元數都不相等,
比如第1列有10個字元
比如第2列有20個字元
比如第3列有30個字元
但裡面都有逗號,要如何逐行統計特定字元個數?比如逗號
我想去記錄每列的逗號共有幾個?
感恩不盡....
六年前有人問過了,答案在此
試試看合不合用
1.readTXT 讀進 Excel
2.改資料
3.writeTXT 寫成檔案
Option Explicit
Sub readTXT()
Dim nRow, nCol As Integer
Dim dataArray, arrLine, oneLine
Dim inFilePath, outFilePath As String
'=============================
'1 of 2 Text file to Excel
'=============================
inFilePath = "C:\temp\myFile.txt"
Open inFilePath For Input As #1
dataArray = Split(Input$(LOF(1), #1), vbLf)
Close #1
For nRow = LBound(dataArray) To UBound(dataArray)
arrLine = Split(dataArray(nRow), ",")
For nCol = LBound(arrLine) To UBound(arrLine)
Range("A1").Offset(nRow, nCol).Value = arrLine(nCol)
Next
Next nRow
End Sub
Sub writeTXT()
Dim nRow, nCol As Integer
Dim dataArray, arrLine, oneLine
Dim inFilePath, outFilePath As String
'=============================
'1 of 2 Text file to Excel
'=============================
inFilePath = "C:\temp\myFile.txt"
Open inFilePath For Input As #1
dataArray = Split(Input$(LOF(1), #1), vbLf)
Close #1
'=============================
'2 of 2 Excel to Text file
'=============================
'Creat new file
outFilePath = "C:\temp\myFileUP.txt"
Open outFilePath For Output As #2
For nRow = LBound(dataArray) To UBound(dataArray)
arrLine = Split(dataArray(nRow), ",")
oneLine = arrLine(LBound(arrLine)) 'The first column
For nCol = LBound(arrLine) + 1 To UBound(arrLine)
oneLine = oneLine & "," & Range("A1").Offset(nRow, nCol).Value
Next
Print #2, oneLine
Next nRow
Close #2
End Sub
最後還是要囉嗦一下
問問題跟看醫生一樣
你講得越多,答案就會越準確
你真正要的答案
遠遠不是「用 VBA 計算幾個逗號」這麼單純
結果繞了一圈
只是多浪費彼此時間而已
大神您好:
公司禁止我們上外網跟帶手機進工作現場,手機不方便描述問題,所以遲到現在才回你。請見諒!!
我使用的語言為vba,我是個初學者,寫過一些小程式。現在有一個困難!!
我們公司要用test原始檔(.csv)去修改值, 0改成25,然後上傳給客戶testup(.csv)。原本我們是用記事本去開啓這個test檔去改為25,但是我們工作很忙常常有同仁不小心誤刪了逗點,這就慘了,因為我們要回傳給客戶 testup(.csv) 必須格式跟test原始檔(.csv)一模一様。所以我用excel開啓,這樣就不會誤刪啦!然後再另存新檔 testup.csv ,可是,您看testup(.csv)卻多了許多逗點,這樣是不被接受的,必須格式跟test原始檔(.csv)一模一様。
我的初步架構想法是這樣的:
1.在excel 模組內寫一個「選取程式」就是一打開我寫的活頁簿暫時叫abc好了,一打開abc他就會跳出一個小訊息視窗,假設裡面有30個檔案我手動點選test.csv
2.讀入檔案,計算每列逗號數量並儲存:先計算共幾列,再建立Array,計算每列逗號並儲存在Array裡,空白列也算一列
3.使用excel「開啓舊檔」功能開啓test.csv改值
4.在模組用寫「儲存程式」,寫入csv檔前逐列比對每列逗號是否少於或多於該列原本的逗號數量,少則補多則刪,若是等於再寫入csv,最後再儲存於指定位置
謝謝您耐心看完這篇文章。
請問您覺得可行嗎?如果可以,請您給我一些指導與建議,非常感謝!!
1.可行
2.換成是我,我不會這麼寫
我想想看,你看別的高手的做法先...
程式已更新在回答區
公司禁止我們上外網跟帶手機進工作現場
看來是間好公司
大神早安:
您說的極是,「結果繞了一圈,只是多浪費彼此時間而已」
學妹會謹記在心。
1.可能可以用
把inFilePath="c:\temp\myFile.txt"
改成inFilePath=SelectFile("c:\temp", "*.csv")
試試看
2.檔案找不到
因為程式寫的是 myFile.txt
妳的檔案是 myFile.csv
看妳要改那一個都可以
感謝大神,我再試試!
大神您好:
這幾晚我在寫一些比較細節面的程式碼:
1.將Dim inFilePath As String定義在所有的sub外:
因為我在sub auto_open()裡面,寫了inFilePath = selectFile() ,希望 writeTXT()能直接取用這個變數,可是執行卻出現問題,再麻煩大神看問題是出在哪裡,謝謝您https://ithelp.ithome.com.tw/upload/images/20201124/20132757rnHtFleWsP.jpg
如果妳的路徑檔案都沒錯的話
就可能是無法使用那個 #2
原
Open outFilePath For Output As #2
改成
nOutFileNum = FreeFile
Open outFilePath For Output As #nOutFileNum
原
Print #2, oneLine
改成
Print #nOutFileNum, oneLine
原
Close #2
改成
Close #nOutFileNum
1.詳細原因可參考這篇
2.萬一 #1 出錯的話,也比照修改
他show
Sub writeTXT()
Dim nRow, nCol As Integer
Dim dataArray, arrLine, oneLine
Dim inFilePath, outFilePath As String
加一列
Sub writeTXT()
Dim nRow, nCol As Integer
Dim dataArray, arrLine, oneLine
Dim inFilePath, outFilePath As String
Dim nOutFileNum
加好了,他show
往上找如果妳的路徑檔案都沒錯的話 就可能是無法使用那個 #2
那段
我修改了一些程式碼
(大致上是 nOutFileNum 前要加 #)
會不會是我的路徑檔案有問題,我無意中看到
電腦有show infilepath=""
大神早安~
向您稟告最新進度:
原本 writeTXT 和 readTXT 裡的 路徑檔名 都是寫死的
都能正常執行
既然妳要修改 readTXT 裡的 路徑檔名
改成讓使用者自己選擇
那妳就要想辦法把 readTXT 裡「使用者自己選擇的路徑檔名」
設定給 writeTXT 裡的 inFilePath
ok
那妳就要想辦法把 readTXT 裡「使用者自己選擇的路徑檔名」
設定給 writeTXT 裡的 inFilePath---->今天已改好
大神早安
雖然有show"陣列索引超出範圍", 但資料卻還是有成功輸出,真奇怪
主語言是?
我偷吃步不愛用do ... until
以C#回答
string astr = "aa,bb,cc,dd,ee,ff,gg";
int n = astr.Split(new char[',']).Length;
Console.WriteLine($"逗點數有{n-1}個");
用javascript回答
let astr = "aa,bb,cc,dd,ee,ff,gg";
let n = astr.split(',').length;
Console.log(`逗點數有${n-1}個`)
不小心用了string interpolation字串插補
再用VB(A)回答
Dim a As String
a = "aa,bb,cc,dd,ee,ff"
MsgBox ("逗點數有" & UBound(Split(a, ",")) & "個")
其他語言差不多都如此
學習語言最好先畫流程圖,把邏輯流程搞清楚,不管你用什麼語言都可以駕輕就熟。
而且自己要動手做,做中學最快,用問的只會一知半解,這一題你覺得會了,再出
一題類似的問題,你一定還是不會,因為你的邏輯概念不足以去解決問題。