找回密码  加入

AUTOIT CN

搜索
查看: 353|回复: 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類似格式的方式
    是否有比較適合的寫法?
    附上原始碼。
  1. #include <FileConstants.au3>
  2. #include <Excel.au3>
  3. #include <MsgBoxConstants.au3>

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

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

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

  14. _Excel_BookClose($oWorkbook, True)

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


本帖子中包含更多资源

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

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

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

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

复制代码





本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

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

本帖子中包含更多资源

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

x
发表于 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"   

本帖子中包含更多资源

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

x
 楼主| 发表于 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,需修改。




本帖子中包含更多资源

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

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

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





本帖子中包含更多资源

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

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

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



本帖子中包含更多资源

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

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

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

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

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

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

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

  47. _Excel_BookClose($oWorkbook, True)

  48. Local $CSV_Data_Path = @ScriptDir & "\PIDS-CM-INPUT.CSV"
  49. Local $oExcel = _Excel_Open()
  50. Local $oWorkbook = _Excel_BookOpen($oExcel, $CSV_Data_Path)
  51. Local $sRange = "G:G"
  52. _Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊故障敘述,保留已移除不可見字元欄位
  53. Local $sRange = "H:H"
  54. _Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊故障描述補充說明,保留已移除不可見字元欄位
  55. Local $sRange = "J:J"
  56. _Excel_RangeDelete($oWorkbook.ActiveSheet, $sRange, $xlShiftToLeft) ;刪除舊維修處理情形,保留已移除不可見字元欄位
复制代码

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2019-8-21 16:29 , Processed in 0.078125 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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