iT邦幫忙

0

統計逗號有幾個

vba

您好:

   請問如我有一個csv檔,裡面有3列,每一列的字元數都不相等,
   比如第1列有10個字元
   比如第2列有20個字元
   比如第3列有30個字元
   但裡面都有逗號,要如何逐行統計特定字元個數?比如逗號
   我想去記錄每列的逗號共有幾個?
   
   感恩不盡....
   
看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 2 級 ‧ 2020-11-18 12:30:46 檢舉
csv檔一般指的是逗點分隔,內容可能是長這樣:
id,username,note
001, aloha, a good man
002, bob, a good man too
逐行統計逗號的用意是?
丹尼 iT邦新手 5 級 ‧ 2020-11-18 12:39:04 檢舉
鎖定關鍵字前後的逗號數,然後針對那個逗號流水,讀取導入資料庫?(猜)
ccutmis iT邦高手 2 級 ‧ 2020-11-18 13:06:33 檢舉
我曾遇過csv逗點分隔文字檔裡面出現非用來分隔的逗點,那個文字檔是用excel另存的,在欄位裡面的值如果有包含逗點的,他會把有逗點那一欄的值加上雙引號(")包含起來,這樣就會出現比原先預期的逗點號多的情況(一般來說 欄位數=逗號數+1)
後來我都改用tab分隔文字檔了^^"
逐行統計逗號的用意是?→逐列統計逗號
讀取導入資料庫?(猜)→不是哦
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
海綿寶寶
iT邦大神 1 級 ‧ 2020-11-18 12:39:33
最佳解答

六年前有人問過了,答案在此

試試看合不合用
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.換成是我,我不會這麼寫
我想想看,你看別的高手的做法先...

程式已更新在回答區

公司禁止我們上外網跟帶手機進工作現場

看來是間好公司
/images/emoticon/emoticon12.gif

大神早安:
您說的極是,「結果繞了一圈,只是多浪費彼此時間而已」
學妹會謹記在心。

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.jpghttps://ithelp.ithome.com.tw/upload/images/20201124/20132757Y9IpYU4gJ6.jpg

/images/emoticon/emoticon13.gif

如果妳的路徑檔案都沒錯的話
就可能是無法使用那個 #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 出錯的話,也比照修改

他showhttps://ithelp.ithome.com.tw/upload/images/20201124/20132757kYxa5eIrDv.jpg

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

加好了,他showhttps://ithelp.ithome.com.tw/upload/images/20201124/20132757ELKXJlWcXS.jpg

往上找
如果妳的路徑檔案都沒錯的話 就可能是無法使用那個 #2那段

我修改了一些程式碼
(大致上是 nOutFileNum 前要加 #)

會不會是我的路徑檔案有問題,我無意中看到
電腦有show infilepath=""

大神早安~
向您稟告最新進度:
https://ithelp.ithome.com.tw/upload/images/20201125/20132757dR7hoH0q1T.jpghttps://ithelp.ithome.com.tw/upload/images/20201125/20132757AHp3gPyc3b.jpg

原本 writeTXT 和 readTXT 裡的 路徑檔名 都是寫死的
都能正常執行
既然妳要修改 readTXT 裡的 路徑檔名
改成讓使用者自己選擇
那妳就要想辦法把 readTXT 裡「使用者自己選擇的路徑檔名」
設定給 writeTXT 裡的 inFilePath

ok

那妳就要想辦法把 readTXT 裡「使用者自己選擇的路徑檔名」
設定給 writeTXT 裡的 inFilePath---->今天已改好

/images/emoticon/emoticon61.gif

大神早安

雖然有show"陣列索引超出範圍", 但資料卻還是有成功輸出,真奇怪

大神,請問您在忙嗎?還是...不打算理我了?/images/emoticon/emoticon02.gif

大神您好,程式碼已全部完成。
在測試過程中,同仁發現一個問題:正常是要照原始檔一模一樣輸出,
但在某些電腦會發生每一列中間都會隔著一列空白列!

我猜想應該是 dataArray = Split(Input$(LOF(1), #1), vbLf)中
的vblf造成,可能某些平台不能接受。如果將它改為vbcrLf,您覺得ok嗎?謝謝您

我不重要
你要的結果才重要

只要改出你要的結果就 ok 了

提供vbLf 相關說明給你參考

的確,一般(Windows)作業系統用 vbCrLf;有些(Unix)作業系統用 vbLf 做為換列字元

4
japhenchen
iT邦超人 1 級 ‧ 2020-11-18 14:37:11

主語言是?

我偷吃步不愛用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, ",")) & "個")

其他語言差不多都如此

用python回答
(很無腦,好怕被罵)

astr = "aa,bb,cc,dd,ee,ff"
print("逗點一共有{0}個".format(astr.count(",")))

vba 謝謝您

我的回覆串裡有VBA的解法,請參考
commacount = UBound(Split(a, ","))

Dim a As String
a = "aa,bb,cc,dd,ee,ff"
MsgBox ("逗點數有" & UBound(Split(a, ",")) & "個")
1
richardsuma
iT邦大師 1 級 ‧ 2020-11-18 17:59:14

學習語言最好先畫流程圖,把邏輯流程搞清楚,不管你用什麼語言都可以駕輕就熟。
而且自己要動手做,做中學最快,用問的只會一知半解,這一題你覺得會了,再出
一題類似的問題,你一定還是不會,因為你的邏輯概念不足以去解決問題。

我要發表回答

立即登入回答