找回密码
 加入
搜索
查看: 2252|回复: 8

[网络通信] EXCEL的CSV檔案單一儲存格處理(已解決)

[复制链接]
发表于 2019-5-12 03:00:38 | 显示全部楼层 |阅读模式
本帖最后由 yohoboy 于 2019-6-1 01:55 编辑

  各位大家好:

     今天又來發問順便賺金幣。此次要詢問的是EXCEL 函數處理。
    因有一個檔案為 CSV檔,以 "," 作為分隔。是用來準備匯入SQLITE 資料庫內。
    但是有一個問題,因如果欄位儲存格有多行資料,例如附件檔的CSV檔案中欄位 F4,跟F9 這兩個儲存格
    因有CHR(10),CHR(13) 也就是有 @CRLF  不可見字元。
    在匯入SQLITE 時會因為資料不對齊(欄位數不相符)無法匯入,因此參考函數寫法後就用偷雞方式處理。
    資料是可以匯入啦,但是有多行的資料儲存格這欄位資料卻怎麼處理也無法分隔,
    例如F9欄位無法隔離造成連字狀況, 變成6_86_8_16_8_26_8_3想要處理成6_8*6_8_1*6_8_2*6_8_3類似格式的方式
    是否有比較適合的寫法?
    附上原始碼。
#include <FileConstants.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>

Local $CSV_Data_Path = FileOpenDialog("選擇檔案", @ScriptDir & "", "(*.CSV)", $FD_FILEMUSTEXIST + $FD_MULTISELECT)
Local $oExcel = _Excel_Open()
Local $oWorkbook = _Excel_BookOpen($oExcel, $CSV_Data_Path)
Sleep(1000)
;使用EXCEL開啟檔案,發現某欄位儲存格有多行資料例如: F4; F9 等欄位
_Excel_RangeInsert($oWorkbook.Activesheet, "G:G", $xlShiftToRight ) ;插入一欄

_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "=CLEAN(F1)", "G1") ;寫入清除不可見字元碼像"CRLF" CHR(10) CHR(13)等
_Excel_RangeCopyPaste($oWorkbook.Activesheet, "G1", "G2:G23", Default, $xlPasteFormats) ; 粘贴格式到目标范围範圍大小須定義

Local $sWorkbook = @ScriptDir & "\TEST-DATA-2.CSV"
_Excel_BookSaveAs($oWorkbook, $sWorkbook, $xlCSV, True)

_Excel_BookClose($oWorkbook, True)

Local $CSV_Data_Path = @ScriptDir & "\TEST-DATA-2.CSV"
Local $oExcel = _Excel_Open()
Local $oWorkbook = _Excel_BookOpen($oExcel, $CSV_Data_Path)
Local $sRange = "F:F"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊欄位不可見字元

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-5-14 14:53:08 | 显示全部楼层
本帖最后由 chzj589 于 2019-5-14 15:21 编辑
yohoboy 发表于 2019-5-13 23:43
感謝回覆,圖上的資料是我最後顯示的結果,只是想要將原本分行的格內資料去除@CRLF後再替換其他符號,也 ...

这样子:
用<字符串管理>函数处理:

For $i = 1 To 26
        ; 读取工作簿中活动工作表指定单元格的数据
        Local $aResult = _Excel_RangeRead($oWorkbook, Default, "F" & $i)
    $iLengthA = StringLen($aResult)
        Local $StripWS = StringStripWS($aResult, 8)
        If $iLengthA > 6 And $iLengthA < 10 Then
                Local $sString = StringMid($StripWS, 1, 3) & "*" & StringMid($StripWS, 4, 5)
                _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $sString, "G4")
        ElseIf $iLengthA > 11 And $iLengthA < 23 Then
                Local $sString = StringMid($StripWS, 1, 3) & "*" & StringMid($StripWS, 4, 5) & "*" & StringMid($StripWS, 9, 5) & "*" & StringMid($StripWS, 14, 5)
                _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $sString, "G9")
        EndIf
Next






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2019-5-12 03:02:06 | 显示全部楼层
忘了附上圖片。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-5-13 09:21:50 | 显示全部楼层
本帖最后由 chzj589 于 2019-5-13 09:23 编辑
yohoboy 发表于 2019-5-12 03:02
忘了附上圖片。



>运行 AU3Check (3.3.14.2) 检查代码.  参数: D:\AutoIt3  au3 文件: D:\AU3调试\SQLite\SQLite\学生成绩统计\CSV-DATA-INPUT\CSV-DATA-INPUT.au3
+>09:18:53 AU3Check 语法检查结束.rc: 0
>运行:D:\AutoIt3\autoit3_x64.exe(3.3.14.2), 脚本: D:\AutoIt3\autoit3_x64.exe "D:\AU3调试\SQLite\SQLite\学生成绩统计\CSV-DATA-INPUT\CSV-DATA-INPUT.au3"   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2019-5-13 23:43:46 | 显示全部楼层
chzj589 发表于 2019-5-13 09:21
>运行 AU3Check (3.3.14.2) 检查代码.  参数: D:\AutoIt3  au3 文件: D:\AU3调试\SQLite\SQLite\学生 ...

感謝回覆,圖上的資料是我最後顯示的結果,只是想要將原本分行的格內資料去除@CRLF後再替換其他符號,也就是F9格內最終顯示為6_8*6_8_1*6_8_2*6_8_3,目前可行的做法好像用正則方式去處理,可惜我還沒研究透,所以看看哪個高人可以寫出來。
发表于 2019-5-15 11:02:08 | 显示全部楼层
chzj589 发表于 2019-5-14 14:53
这样子:
用函数处理:

判断10行以上有BUG,需修改。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-5-20 18:50:52 | 显示全部楼层
chzj589 发表于 2019-5-15 11:02
判断10行以上有BUG,需修改。

无聊,修改了判断,可对9999行进行判断。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2019-5-20 18:52:47 | 显示全部楼层
本帖最后由 chzj589 于 2019-5-20 18:56 编辑
chzj589 发表于 2019-5-15 11:02
判断10行以上有BUG,需修改。

无聊,修改后可对9999行进行判断。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2019-6-1 01:49:48 | 显示全部楼层
本帖最后由 yohoboy 于 2019-6-1 01:52 编辑

最後是採用新增一欄位來處理,比較符合所需,所已附上代碼留作紀念。
#include <Array.au3>
#include <FileConstants.au3>
#include <Excel.au3>
#include <MsgBoxConstants.au3>

Local $CSV_Data_Path = FileOpenDialog("選擇檔案", @ScriptDir & "", "(*.CSV)", $FD_FILEMUSTEXIST + $FD_MULTISELECT)
Local $oExcel = _Excel_Open()
Local $oWorkbook = _Excel_BookOpen($oExcel, $CSV_Data_Path)
Sleep(1000)
Local $sRange = "B:B" ;注意刪除後會遞補所以要邊寫邊測試欄位是否符合
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除SYS
Local $sRange = "F:H"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除報修單位,報修人,維護單位
Local $sRange = "J:M"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除承商處理,派工日期,執行人員,維修人員
Local $sRange = "L:L"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除離場日期
Local $sRange = "N:O"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除里程數,運轉時數
Local $sRange = "Q:Q"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除故障元件
Local $sRange = "Y:Z"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除週轉性商品,轉單日期
Local $sRange = "AB:AB"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除外包總人時
Local $sRange = "AE:AE"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除核準
Local $sRange = "AH:AH"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除RAM
Local $sRange = "AI:AP"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除標註時間,催修時間,斷電時間,斷電人員,是否掛鎖,復電時間,復電人員,斷電副卡已交給承商
Local $sRange = "AJ:AJ"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除轉單理由
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "物料編號", "AJ1") ;增加欄位
_Excel_RangeReplace($oWorkbook, Default, Default, ",", ",") ;查找分隔符號","並替代為","注音豆號
_Excel_RangeReplace($oWorkbook, Default, Default, "'", "-") ;查找分隔符號"'"並替代為"_"底線
_Excel_RangeInsert($oWorkbook.Activesheet, "H:H", $xlShiftToRight )
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "=CLEAN(G1)", "H1") ;寫入清除不可見字元碼
_Excel_RangeCopyPaste($oWorkbook.Activesheet, "H1", "H2:H200", Default, $xlPasteFormats) ; 粘贴格式到目标范围

_Excel_RangeInsert($oWorkbook.Activesheet, "J:J", $xlShiftToRight )
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "=CLEAN(I1)", "J1") ;寫入清除不可見字元碼
_Excel_RangeCopyPaste($oWorkbook.Activesheet, "J1", "J2:J200", Default, $xlPasteFormats) ; 粘贴格式到目标范围

_Excel_RangeInsert($oWorkbook.Activesheet, "M:M", $xlShiftToRight )
_Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, "=CLEAN(L1)", "M1") ;寫入清除不可見字元碼
_Excel_RangeCopyPaste($oWorkbook.Activesheet, "M1", "M2:M200", Default, $xlPasteFormats) ; 粘贴格式到目标范围

Local $sWorkbook = @ScriptDir & "\PIDS-CM-INPUT.CSV"
_Excel_BookSaveAs($oWorkbook, $sWorkbook, $xlCSV, True)

_Excel_BookClose($oWorkbook, True)

Local $CSV_Data_Path = @ScriptDir & "\PIDS-CM-INPUT.CSV"
Local $oExcel = _Excel_Open()
Local $oWorkbook = _Excel_BookOpen($oExcel, $CSV_Data_Path)
Local $sRange = "G:G"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊故障敘述,保留已移除不可見字元欄位
Local $sRange = "H:H"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊故障描述補充說明,保留已移除不可見字元欄位
Local $sRange = "J:J"
_Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊維修處理情形,保留已移除不可見字元欄位
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-25 15:00 , Processed in 0.081559 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表