顯示具有 Programme程式相關 標籤的文章。 顯示所有文章
顯示具有 Programme程式相關 標籤的文章。 顯示所有文章

2024年8月21日 星期三

一鍵完成PROMPT提示詞整合處理,免除打字處理(PYTHON程式)

情境:常使用的日文查詢PROMPT,只要使用Ctrl+C預先拷貝好後,再點選此編譯好的程式後(預先指定好(右鍵|內容|快速鍵(K))執行之快捷鍵,如:自訂Ctrl+Alt+J,將此程式叫出來),即可將剛才能載入記憶體的複製字串,直接寫入提示詞內


💜程式片段說明一:

以下為  testjlptRel01 , (即 input_file1 = r'd:\testjlptRel01.txt') ,請預先用Notepad記事本,將下面藍色部分提示詞貼上,檔名儲存至 d:\testjlptRel01.txt

あなたは日本語のプロで、勉強法の達人です。
{{関連表現}}の語源は教えて、漢字ははっきりとはしないが、省略しても構いません。
{{関連表現}}の文法解説・例文と類義語を簡潔な概要でまとめてください。
もし、その表現はニュアンス、意志、自発、あるいは自分、他の人、その他の表現などに関連があれば、使い方を教えて
暗記しやすいように、その他の類義表現文型と違いところを表形式に挙げてください。
それぞれの表現に焦点を当てたYOUTUBE動画を挙げてください

"""
関連表現:


    
💜程式片段說明二:
# input_file2內容為     """  

 
# 為何要另外加入input_file2.txt , 再補上 """ (三重引用符號),讓AI能夠將它視為整段完整之PROMPT提問文  (亦即,前段日文詢問之PROMPT + OCR辨識後之TXT +最後再補上  三重引用符號)


💜程式片段說明三:
# output_file內容為  d:\testjlpt.txt   ,最後在d槽 ,testjlpt.txt 可查看到完整提示詞資訊,再將此內容貼至 AI神器去詢問


💜程式片段說明四:  (程式功能處理流程)
☺💜從剪貼簿獲取文字。  (即  pyperclip.paste() 獲取剪貼簿中的文字。 將您將想查詢的特定日文字詞,用COPY+C 快速鍵,複製後,對電腦而言已暫存至記憶體起來 ,而透過PYTHON之pyperclip模組,來 獲取剪貼簿中的文字(等同您 手動按 Win+ V ,而此程式自動化幫您處理)。

☺💜將剪貼簿中的文字與指定兩個檔案的內容,按照特定順序合併。  

運行順序1 載入 日文關連式提示詞 ;

運行順序2 載入 想查日文字詞  之已內存記憶體剪貼簿內容 ;

運行順序3 再補上 """ (三重引用符號) ;


運行順序4 將合併後的內容寫入一個新的檔案中。    (即   output_file = r'd:\testjlpt.txt'  )
 

💜將PYTHON程式轉成EXE執行檔(最後一個處理程式步驟)

auto-py-to-exe 轉換PY程式成為EXE

 

💜相關應用參考資訊:
活用 Win視窗鍵+V ,選擇性貼上之功能視窗(記憶體內存剪貼簿)

一鍵完成圖檔OCR辦識,免除打字處理

     
💜完整PYTHON程式如下    

import pyperclip
import subprocess
import os
def append_file_content_in_order(input_file1, input_file2, content_to_append, output_file):
    """將指定內容和兩個檔案的內容按照指定順序追加到檔案末尾。"""
    try:
        with open(output_file, 'w', encoding='utf-8') as f_out, \
                 open(input_file1, 'r', encoding='utf-8') as f_in1, \
                 open(input_file2, 'r', encoding='utf-8') as f_in2:
            f_out.write(f_in1.read())  # 先寫入 input_file1
            f_out.write("\n\n" + content_to_append)  # 再寫入剪貼簿內容
            f_out.write("\n\n" + f_in2.read())  # 最後寫入 input_file2 内容 (即補上  """  三重引用符號 ,做為結尾)
        print(f"已成功將結果寫入 {output_file}")
    except FileNotFoundError as e:
        print(f"Error: 檔案不存在 - {e.filename}")
    except Exception as e:
        print(f"Error: 發生錯誤 - {e}")
if __name__ == "__main__":
    input_file1 = r'd:\testjlptRel01.txt'
    input_file2 = r'd:\testjlptRel02.txt'
    output_file = r'd:\testjlpt.txt'
    clipboard_text = pyperclip.paste()
    append_file_content_in_order(input_file1, input_file2, clipboard_text, output_file)
    subprocess.Popen(['explorer', output_file])         # 將產出最新檔案,直接開啟,方便後續貼至AI神器查詢

 

2024年7月5日 星期五

活用 Win視窗鍵+V ,選擇性貼上之功能視窗(記憶體內存剪貼簿)


情境:
因為不定時處理常態性之編輯事務時,每次都要鍵入 關鍵字1 的字詞,
處理過程中,常會需要鍵入  關鍵字2 ,
處理完成後,又需另外鍵入  關鍵字3

為了解決此種⌈複製/貼上⌋瑣碎編輯問題 ,可先將下面PYTHON程式,預先編譯成EXE執行檔,並寫成BAT批次檔,每當執行特定工作任務前,就執行BAT檔或執行檔,預先將 關鍵字1 關鍵字2 關鍵字3 全部1次性,分批載入記憶體內,
需要使用時 只需要使用⌈ Win視窗鍵+V⌋ ,即可叫出 選擇性貼上之功能視窗(記憶體內存剪貼簿) ,點選所欲使用的那3個關鍵字詞,可以節省每次都要打字之時間 或複製/貼上處理時間😀。

相關好用快速鍵:

Win視窗鍵 + .  (叫出 符號表 / Emoji表情小貼圖😊)


import pyperclip
import time

keywords = [
"關鍵字1", "關鍵字2", "關鍵字3"]

for keyword in keywords:
    pyperclip.copy(keyword)
    print(f"已將 '{keyword}' 複製到剪貼簿,您可用Win+V 叫出後,選擇性貼上")
    time.sleep(0.5)  # 停留 0.5 秒 (500 毫秒)

 

2024年6月30日 星期日

一鍵完成圖檔OCR辦識,免除打字處理

情境:YOUTUBE上有許多優秀的日文老師的提供考題解析或文法解析,不過有時仍想再藉助AI神器分析解題或文法,只是部分YT,並未提供SRT字幕SubRip subtitle file,可以免去打字處理,此時就需透過手動截圖方式(PNG、JPEG),貼到小畫家後,另存成圖檔,再轉交由OCR辨識軟體將日文辨識出來,進行解題,過程有些繁瑣。

解決辦法:
透過PYTHON程式,將下面程式另存成png2txt.jp編譯成png2txt.EXE執行檔後,直接於截圖後,使用下面之步驟二方式,一鍵完成日文OCR辨識處理。
由系統快取資訊,取得剛才截圖資訊,直接提供給OCR辨識軟體(Tesseract )轉換成純文字,最後將它交給AI神器進行解題即可 (無需另外開啟小畫家,存檔覆寫等處理)


💜操作步驟一(截圖處理): Shift + Win + S 快速鍵,區塊截取圖片轉換為日文TXT純文字,ScreenShot圖檔即可用PYTHON程式直接取用 CACHE記憶體內之截圖資訊
💜步驟二:點選執行,預先編譯好之png2txt.EXE執行檔,即可一鍵完成日文OCR辦識處理。
💜步驟三:複製剛辨識完成之TXT檔,貼至AI神器💯上去詢問日文考題解析或文法解析。


相關資源:
YOUTUBE字幕下載
OCR辨識軟體🔣(圖檔轉文字jpg2txt)Tesseract
🏯AI神器解析日文考題或句子結構

Mac 上的 Shift + Command + 4 組合鍵,類似 Windows 上的 Win + Shift + S,可方便地選擇性截取螢幕的一部分。


# -*- coding: utf-8 -*-
'''
python取圖檔,辨識日文考題
'''
import os
import subprocess
import sys
from PIL import Image, ImageGrab
import pytesseract

def save_clipboard_image(filename='screenshot.png'):
    try:
        # 獲取剪貼簿中的圖像
        image = ImageGrab.grabclipboard()

        if image is None:
            print("剪貼簿中沒有圖像資料")
            return

        # 保存圖像為PNG格式,覆蓋同名文件
        image.save(filename, 'PNG')
        print(f"圖像已保存為 {filename}")

    except Exception as e:
        print(f"無法保存圖像: {e}", file=sys.stderr)

def ocr_image_to_text(image_path):
    # 檢查檔案是否存在
    if not os.path.exists(image_path):
        print(f"Error: File not found - {image_path}")
        return

    # 修改為您的 Tesseract 安裝路徑
    pytesseract.pytesseract.tesseract_cmd = 'd:/Program Files/Tesseract-OCR/tesseract.exe'

    img = Image.open(image_path)
    text = pytesseract.image_to_string(img, lang='jpn')  # 辨識日文考題

    # 輸出檔案名稱根據輸入檔案修改
    output_file = os.path.splitext(image_path)[0] + '.txt'
    with open(output_file, mode='w', encoding='UTF-8') as f:
        f.write(text)

    print(f"OCR結果已保存為 {output_file}")
    subprocess.Popen(['explorer', output_file])  # 使用 list 形式傳遞參數

if __name__ == "__main__":
    image_filename = 'D:\Program Files\Tesseract-OCR\screenshot.png'
   
save_clipboard_image(image_filename)
    ocr_image_to_text(image_filename)

 

 ###################################################

#以下為進階python版本之 一鍵完成圖檔OCR辨識: (直接將prompt日文提示詞,併入掃描ocr辨識結果,結合起來後,直接自動化用檔案總管開啟 d:\testjlpt.txt')

# input_file1內容,如下:

あなたは日本語のプロで、国語の問題を解きの達人です。

{{問題文}}は1~4の中から最も適切なものを一つ選んでください。

(中略)

"""
問題文:

 

# input_file2內容為     """  
#為何要另外加入
input_file2.txt ,是為了將 4選1選項問答PROMPT提問文:  +OCR辨識之TXT結果後,再補上 """ (三重引用符號),讓AI能夠將它視為整段完整之PROMPT提問文  (亦即,前段日文詢問之PROMPT + OCR辨識後之TXT +最後再補上  三重引用符號)

# output_file內容為  d:\testjlpt.txt'   

 

import os
import subprocess
from PIL import Image, ImageGrab
import pytesseract

def save_clipboard_image(filename='screenshot.png'):
    """保存剪貼簿中的圖像。"""
    image = ImageGrab.grabclipboard()
    if image:
        image.save(filename, 'PNG')
        print(f"圖像已保存為 {filename}")
        return filename
    else:
        print("剪貼簿中沒有圖像資料")
        return None


def ocr_image_to_text(image_path, lang='jpn'):
    """使用 Tesseract OCR 對圖像進行文字辨識。"""
    if not os.path.exists(image_path):
        print(f"Error: File not found - {image_path}")
        return None

    pytesseract.pytesseract.tesseract_cmd = r'D:/Program Files/Tesseract-OCR/tesseract.exe'
    return pytesseract.image_to_string(Image.open(image_path), lang=lang)


def append_file_content_in_order(input_file1, input_file2, content_to_append, output_file):
    """將指定內容和兩個檔案的內容按照指定順序追加到檔案末尾。"""
    try:
        with open(output_file, 'w', encoding='utf-8') as f_out, \
                open(input_file1, 'r', encoding='utf-8') as f_in1, \
                open(input_file2, 'r', encoding='utf-8') as f_in2:

            f_out.write(f_in1.read())  # 先
入 input_file1 内容 (00)
            f_out.write("\n\n" + content_to_append)  # 再
入 OCR 
            f_out.write("\n\n" + f_in2.read())  # 最后
入 input_file2 内容 (01)

        print(f"已成功將結果寫入 {output_file}")

    except FileNotFoundError as e:
        print(f"Error: 檔案不存在 - {e.filename}")
    except Exception as e:
        print(f"Error: 發生錯誤 - {e}")


if __name__ == "__main__":
    image_filename = r'D:\Program Files\Tesseract-OCR\screenshot.png'
    input_file1 = r'd:\testjlpt00.txt'
    input_file2 = r'd:\testjlpt01.txt'
    output_file = r'd:\testjlpt.txt'

    saved_image_path = save_clipboard_image(image_filename)
    if saved_image_path:
        ocr_text = ocr_image_to_text(saved_image_path)

        if ocr_text:
            append_file_content_in_order(input_file1, input_file2, ocr_text, output_file)

            print(f"OCR結果已保存為 {output_file}")
            subprocess.Popen(['explorer', output_file])
 

2024年6月27日 星期四

藉由AI神器,協助將WORD排版好轉出HTML格式,簡潔化處理 Docx_2_HTML

情境:工作需要為維持靜態網頁程式版面,預先以WORD編輯好版面,但另存成HMTL檔案,再貼到網站原始碼處。
但微軟WORD檔,另存成HTML時,常會殘留非必要之多餘資訊(如:CLASS、Meta),可經由PYTHON程式,將它部分簡潔化處理。

💙使用步驟一:將WORD文件,預先簡單排版,並另存新檔,下拉存檔類型(T):  已篩選的網頁(*.htm;*.html)
💙步驟二:將下面PYTHON程式,另存成Doc_2_HTML.py (前提:已預先安裝好PYTHON執行環境)
💙步驟三:將步驟一之HTML檔案,Drag-and-drop拖曳至Doc_2_HTML.py ,即可完成轉換產出處理。


PROMPT提示詞,產製PYTHON操作,如下:

你現在是資深網頁排版人員及PYTHON資深工程師,目前有一個微軟DOC檔,另存成HTML格式,
因為網頁程式無需WORD提供多餘內容(如:註解、Class屬性、span標籤等),請協助予以簡潔化處理後,產製PYTHON程式,
來源讀取以ARGC、ARGV方式進行,輸出檔名以輸入來源加入_OUT,如遇重覆再加入流水號。


💜可將此PYTHON程式,上傳給AI神器,並告訴AI程式您的新需求 (如:可將 font-family:標楷體  透過DIV之標籤,置於上方外框架處,並請重新產製完整PYTHON程式,將版面更精簡,如:wrap_with_div(soup)程式區塊),請它再重新產製完整PYTHON程式即可

💜PROMPT提示詞追補(請AI神器將本PYTHON程式,以Class類別方式改寫,並提供完整PYTHON程式及類別之方法詳細解說)。

import re
import os
import sys
import time
import chardet
from bs4 import BeautifulSoup, Comment ,Tag
import logging
import argparse

def detect_encoding(file_path):
    """
    使用 chardet 庫檢測文件編碼
    """
    with open(file_path, 'rb') as f:
        raw_data = f.read()
        result = chardet.detect(raw_data)
        return result['encoding']

def remove_comments(soup):
    """
    移除所有註解
    """
    for comment in soup.find_all(string=lambda text: isinstance(text, Comment)):
        comment.extract()

def remove_classes(soup):

    """
    移除所有 class 屬性
    """

    for tag in soup.find_all(class_=True):
        del tag['class']

def remove_word_meta_tags(soup):

    """
    移除 meta 標籤中生成器訊息
 
   """

    for meta_tag in soup.find_all('meta', {'name': 'Generator', 'content': re.compile(r'Microsoft Word')}):
        meta_tag.extract()

def remove_spans(soup):

    """
    移除所有 span 標籤
    """

    for span_tag in soup.find_all('span'):
        span_tag.unwrap()

def unwrap_anchor_tags(soup):

    """
    移除所有非 href 錨點標籤,但保留其中的内容
    """

    for a_tag in soup.find_all('a', href=False):
        a_tag.unwrap()

def remove_styles(soup):

    """
    移除所有 style 屬性
    """

    for tag in soup.find_all(style=True):
        del tag['style']

def clean_style_tags(soup):

    """
    移除所有含有 @font-face 和 @page 的註解,以及 Word 残留样式定义
    """

    for style_tag in soup.find_all('style'):
        if style_tag.string:
            style_content = style_tag.string
            style_content = re.sub(r'@font-face\s*\{[^}]*\}', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'@page\s*[^}]*\}', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'\/\*[^*]*\*+([^/*][^*]*\*+)*\/', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'<!--[^>]*-->', '', style_content, flags=re.DOTALL)
            style_content = re.sub(r'\s*\{[^}]*\}', '', style_content, flags=re.DOTALL) # Remove all remaining style definitions
            if not style_content.strip():
                style_tag.extract()
            else:
                style_tag.string.replace_with(style_content)

def remove_empty_paragraphs(soup):

    """
    移除所有空的 p 標籤,只有內容为空或只包含空格的情况才移除
    """

    for p_tag in soup.find_all('p'):
        if not p_tag.text.strip():
            p_tag.extract()


def process_tables(soup):

    """
    處理表格,生成 summary 屬性並設置 scope 屬性
    """

    for table in soup.find_all('table'):
        # 檢查表格是否有標題列 (<th>)
        has_header_row = any(tr.find('th') for tr in table.find_all('tr'))

        if has_header_row:
            # 如果有標題列,則使用標題列內容作為列名
            headers = table.find_all('th')
            column_names = [header.get_text(strip=True) for header in headers]
        else:
            # 如果沒有標題列,則使用第一列數據作為列名
            first_row = table.find('tr')
            if first_row:
                column_names = [cell.get_text(strip=True) for cell in first_row.find_all(['th', 'td'])]
            else:
                # 如果表格為空,則設置列名為空列表
                column_names = []

        # 嘗試從前面的段落中獲取表格用途,並檢查其中是否包含 <b> 標籤
        previous_element = table.find_previous('p')
        if previous_element and previous_element.find('b'):
            table_purpose = previous_element.b.get_text(strip=True)  # 直接從 <b> 中提取文字
        else:
            # 如果沒有找到前面的段落或標題,使用表格的所有列名作為 table_purpose
            table_purpose = "、".join(column_names) if column_names else "未知表格用途"

        # 確保 column_names 包含有效的名稱,否則設置為 "未知"
        column_names = [name if name else "未知" for name in column_names]

        # 生成 summary 屬性文字,確保列數訊息正確
        num_columns = len(column_names)
        column_info = "、".join([f"第{i+1}直欄為{column_names[i]}" for i in range(num_columns)]) if num_columns > 0 else "無直欄位"
        summary_text = f"{table_purpose},{column_info}。"

        # 更新表格的 summary 屬性
        table['summary'] = summary_text

        # 設置 th 和 td 的 scope 屬性 (僅在有標題列時)
        if has_header_row:
            for th in headers:
                th['scope'] = 'col'

            for tr in table.find_all('tr'):
                if tr.find('th'):
                    continue  # 跳過表格標題行
                for td in tr.find_all('td'):
                    td['scope'] = 'row'

        # Debugging output to check the generated summary text
        print("Generated summary text:", summary_text)
        



def wrap_with_div(soup):

    """用 <div> 標籤包裹整個文檔内容,並設置標楷體字體樣式"""
    # 如果没有 html 標籤,則創建
    if not soup.html:
        new_html = soup.new_tag('html')
        soup.append(new_html)

    # 如果没有 body 標籤,則創建
    if not soup.body:
        soup.html.append(soup.new_tag('body'))

    # 創建外部 div
    outer_div = soup.new_tag("div", style="font-size:100%;font-family:'標楷體';")

    # 將body 中的所有内容移動到外部 div
    for child in soup.body.contents:
        if isinstance(child, Tag):
            outer_div.append(child.extract())

    # 創建内部 div
    inner_div = soup.new_tag("div")
    inner_div.append(outer_div)

    # 將内部 div 添加到 body
    soup.body.append(inner_div)



def optimize_html_content(html_content, input_file):

    """
    最佳化 HTML 內容,移除多餘資訊,並以輸入檔名加上 "_out" 命名輸出。
    """

    try:
        soup = BeautifulSoup(html_content, 'html.parser')

        remove_comments(soup)
        remove_classes(soup)
        remove_word_meta_tags(soup)
        remove_spans(soup)
        unwrap_anchor_tags(soup)
        remove_styles(soup)
        clean_style_tags(soup)
        remove_empty_paragraphs(soup)
        process_tables(soup)
        wrap_with_div(soup)


        # 以輸入檔名加上 "_out" 命名輸出檔案,處理重複情況(加入流水號)
        base_filename, ext = os.path.splitext(input_file)
        filename = f"{base_filename}_out{ext}"
        counter = 1

        while os.path.exists(filename):
            filename = f"{base_filename}_out_{counter}{ext}"
            counter += 1


        # 寫入修改後的 HTML 內容,使用 'utf-8' 編碼
        with open(filename, 'w', encoding='utf-8') as file:
            file.write(str(soup))

        # 列印儲存的檔案名稱
        print(f"已儲存最佳化後的 HTML 檔案:{filename}")

    except Exception as e:
        # 列印錯誤訊息
        logging.error(f"發生錯誤:{e}", exc_info=True)
        # 等待5秒鐘以便使用者查看錯誤訊息
        time.sleep(5)


def main():
    parser = argparse.ArgumentParser(description='優化HTML文件内容')
    parser.add_argument('filename', help='輸入的HTML文件名')
    args = parser.parse_args()

    input_file = args.filename
    try:
        # 使用 chardet 庫檢測文件編碼
        detected_encoding = detect_encoding(input_file)

        # 使用正確的編碼讀取文件
        with open(input_file, 'r', encoding=detected_encoding) as file:
            html_content = file.read()

        optimize_html_content(html_content, input_file)

    except FileNotFoundError:
        logging.error(f"找不到檔案: {input_file}")
        time.sleep(5)
    except Exception as e:
        logging.error(f"發生錯誤:{e}", exc_info=True)
        time.sleep(5)

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    main()

 


相關查詢:

Removes unnecessary HTML tags from Word documents and outputs clean HTML.
Word文書から生成されるHTMLの不要な情報を取り除いて、きれいなHTMLを出力します。

藉由AI神器,生成Offline image downsizing utilities

情境:因同事經常上傳大圖檔,易造成網路壅塞瓶頸,因此請AI神器,生成離線圖檔縮小工具程式

💜處理及使用
可透過auto-py-to-exe 轉換PY程式(將下面紫色部分,用記事本複製貼上,另存成*.py檔),編譯成 EXE執行檔,

💜同仁將超大圖檔Drag-and-drop拖曳(自動讀取檔案來源將路徑傳入Argc 、Argv參數,)至 轉換好之EXE檔上面 ,即可進行圖檔縮小轉換處理。

相關程式: Image-upscaling影像圖檔模糊怎麼辦?


PROMPT提示詞下法,如下:

請寫一個PYTHON程式,
來源檔為jpg,png圖檔,影像予以縮小? max_size=(1920, 1080) ,
如來源影像大小,低於500k以下者,就不做處理,
輸入方式以argc argv方式讀取檔案
輸出檔名,與輸入檔名相同,另再加入_C



import os
import argparse
from PIL import Image

def resize_image(file_path, output_path, max_size=(1920, 1080)):
    with Image.open(file_path) as img:
        img.thumbnail(max_size, Image.Resampling.LANCZOS)
        img.save(output_path)

def main():
    parser = argparse.ArgumentParser(description='Resize images if they exceed 1MB.')
    parser.add_argument('images', metavar='N', type=str, nargs='+', help='List of image files to be processed')
    args = parser.parse_args()
    
    for img_file in args.images:
        if os.path.getsize(img_file) > 500  * 1024:  # Check if file size is greater than 500k
            file_root, file_ext = os.path.splitext(img_file)
            output_file = f"{file_root}_C{file_ext}"
            resize_image(img_file, output_file)
            print(f"Resized image saved as {output_file}")
        else:
            print(f"Image {img_file} does not exceed 500k, no resizing needed.")

if __name__ == '__main__':
    main()

2024年4月26日 星期五

經由Groq API功能,使用Meta開放源碼Llama3-70b-8192模型,進行 日文PROMPT提示詞 查詢

藉由免費Groq API服務,橋接使用臉書Meta開放源碼LLM大語言模型,進行 日文相關查詢運用

💜步驟一:

☺💟https://console.groq.com/keys  取得API KEY

☺💟在自己的電腦環境變數,加入GROQ_API_KEY變數,指定您所取得API KEY值

💜步驟二: 備妥PYTHON執行環境

 pip install groq

💜步驟三:將下面藍色部分,另存成 PYTHON程式碼(如:testgroq.py ),並且執行它即可

import os

from groq import Groq

client = Groq(
    api_key=os.environ.get("
GROQ_API_KEY"),
)

chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content":
"あなたは日本語のプロで、勉強法の達人です。 {{関連表現}}の語源は教えて、漢字ははっきりとはしないが、省略しても構いません。 {{関連表現}}の文法解説・例文と類義語を簡潔な概要でまとめてください。もし、その表現はニュアンス、意志、自発、あるいは自分、他の人、その他の表現などに関連があれば、使い方を教えて暗記しやすいように、その他の類義表現文型と違いところを表形式に挙げてください。それぞれの表現に焦点を当てたYOUTUBE動画を挙げてください 関連表現: かたがた、を兼ねて、ついで、がてら、かたわら ",
        }
    ],
    model="Llama3-70b-8192",
)

print(chat_completion.choices[0].message.content) 

 

相關資訊:

Japanese relationship learning日文相關連關鍵資訊查詢,增進廣度面向之學習。

💛後記:測試結果,取得YOUTUBE連結不能使用,可能持續MachineLearning學習中?

             此種查詢傳遞方式,仍需留意資料是否含機敏資訊?

💛Temperature Control: (可於程式碼中 ,在model="Llama3-70b-8192"上方,加入 temperature  = 0.1 ,不加溫度參數效果較好)A lower temperature results in more deterministic and focused responses, while a higher temperature increases diversity and explores more unconventional possibilities

💛檔名請勿以 groq.py 命名,否則會出現下面錯誤訊息 👀
ImportError: cannot import name 'Groq' from partially initialized module 'groq' (most likely due to a circular import)

💙回傳結果如下:

**1. かたがた (katagata)**
Meaning: and so on, and other things like that
 (略)
Example sentence: 私のかたがた、運動ですか? (Watashi no katagata, undō desu ka? - Are you doing exercise and other things like that?)

**2. を兼ねて (o kane te)**
Meaning: while doing, simultaneously
(略)
Example sentence: 私は仕事を兼ねて、ユーチューブを見ています (Watashi wa shigoto o kane te, Yūchūbu o mite imasu - I'm watching YouTube while working)

**3. ついで (tsuide)**
Meaning: by the way, while I'm at it
(略)
Example sentence: 私は店についで、雑貨を買います (Watashi wa mise ni tsuide, zakka o kaimasu - I'll buy some miscellaneous goods while I'm at the store)

**4. がてら (gatera)**
Meaning: and other things, et cetera
(略)
Example sentence: 私は料理がてら、健康について学びます (Watashi wa ryōri gatera, kenkō ni tsuite gakushū shimasu - I'll learn about cooking and other things, like health)

**5. かたわら (katawara)**

- This word means "on the side" or "in addition to."
        * Example: 「私は本業のかたわら、フリーランスの仕事もしています」(In addition to my main job, I also do freelance work on the side.)

(略)

參考資訊:

https://console.groq.com/docs/quickstart

 

'##################################################################### 

💛動態傳遞參數範例1: 使用方式  python testgroq.py 您提問的問題

#placeholder text from the dynamic value (sys.argv[1])  

import os
import sys
from groq import Groq

client = Groq(
    api_key=os.environ.get("GROQ_API_KEY"),
)

# Get the dynamic expression from sys.argv[1]
dynamic_expression = sys.argv[1]

# Replace the placeholder text with the dynamic expression
chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": f"{dynamic_expression}",
        }
    ],
    model="Llama3-70b-8192",
)
# Print the generated response
print(chat_completion.choices[0].message.content)


'##################################################################### 

💛動態傳遞參數範例2:  將常用的詢問(日文文法查詢)預先作好Prompt樣版,只要將您詢問參數代入,即可查詢

python testgroq.py  如し、如く、如き

 #placeholder text from the dynamic value (sys.argv[1])  

import os
import sys
from groq import Groq

client = Groq(api_key=os.environ.get("GROQ_API_KEY"))

# Get the dynamic expression from sys.argv[1]
dynamic_expression = sys.argv[1]

# Construct the message content with the dynamic expression
user_message = {
    "role": "user",
    "content": f"あなたは日本語のプロで、勉強法の達人です。日本語の文法を徹底解説してください。例えば:文型、ニュアンス、図表、例文(専門家向け)下記の問題を徹底ステップバイステップ解説してください: {dynamic_expression}",
}

# Generate completion using Groq API
chat_completion = client.chat.completions.create(
    messages=[user_message],
    model="Llama3-70b-8192",
)

# Extract and print the generated response
generated_response = chat_completion.choices[0].message.content
print(generated_response)

 

💙回傳結果如下:

 What an honor to delve into the intricacies of Japanese grammar!

**如し (nashi)**   (小BUG錯誤🚨 ,正確應該 gotosi)

* Usage: Used to describe a comparison or analogy, often with a sense of similarity or resemblance.
* Example sentences:
       (略)
        + 彼の顔は
如し私の叔父のように見える (Kare no kao wa nashi watashi no oji no you ni mieru) - His face looks like my uncle's.    小BUG錯誤🚨終止形,詞性屬⌈文言比況助動詞⌋,通常放句尾,相當於ようだ

**如き (ki)** 

* Usage: Used to describe a hypothetical or imaginary situation, often with a sense of uncertainty or tentativeness.
* Example sentences:
        + 私は
如き億万長者のように生活している (Watashi wa ki no okuman chōja no you ni seikatsu shite iru) - I'm living as if I were a billionaire. 🚨連体形,相當於ような
  (略)

**如く (ku)**
* Usage: Used to describe a manner or method of doing something, often with a sense of following a model or example.
* Example sentences:
(略)
        + 彼は如く名選手のように球をプレイする (Kare wa ku mei senshu no you ni yakyū o purei suru) - He plays baseball like a famous player.  🚨連用形,相當於ように

(略)

2024年4月22日 星期一

PivotTable樞鈕分析表,搭配Formula公式運用,詳列出⌈廠牌型號⌋,在各個" 部門別"之擁有 台數 報表產製

EXCEL資料表,分別有 財產設備大分類、廠牌型號、部門別、數量 等4欄位,
        A                                  B                       C                 D
1    財產設備大分類        廠牌型號              部門別           數量
2    個人電腦           HP Pro SFF 400 G9    人事               2
3    個人電腦           HP Pro SFF 400 G9     財務              2
4    個人電腦           HP Pro SFF 400 G9    行政               2
5    個人電腦           HP Pro SFF 400 G9     銷售              2
6    個人電腦           ASUS S500TE             研發               1
7    個人電腦           HP Pro SFF 400 G9     研發               1
8    個人電腦           HP Pro SFF 400 G9     資訊               2


公司部門,有人事、財務、行政、銷售、研發、資訊等6部門別

有1份報表,需臚列出  財產設備大分類,其各⌈廠牌型號⌋,分配到公司,各個部門之台數(如下方產出的結果)

,####################################################################################
以下是個人作法,先用「樞紐分析表」,將EXCEL資料 預做梳理,
 

在以下區域之間拖曳欄位:

💛篩選  拖曳  財產設備大分類、    (因為有數個「財產設備大分類」項目,如:個人電腦、筆電)
💜欄    拖曳  部門別、                    (方便掌握 各部門別,可逐欄一一列出)
💜列    拖曳   廠牌型號、              (各廠牌型號,以此例「個人電腦」大分類,呈現會有2列,

                                                   分別  為HP Pro SFF 400 G9 及 ASUS S500TE    等2類桌機
💜值    拖曳    數量                        (可幫忙預先加總,列出各部門別,各廠牌型號 電腦之台數)
'=====================================================================
💙'T1欄及O1欄,公式手動設定好
💛B1欄,為PivotTable樞鈕分析表之 大分類「財產設備大分類」,個人電腦、筆電等可供下拉(此欄位值,即為上面  篩選  拖曳,自動產生),只要下拉變動不同之大分類,樞鈕分析表之欄及列 資料,也會隨之變動。

💙T1欄(=COUNTA(4:4)),為PivotTable樞鈕分析表之總欄數   ,因為第4列為PivoteTable部門別,逐欄一一列出,此T1欄的值,為手動填入COUNTA公式
此公式之目的主要為讓後續VBA程式,清楚掌握「個人電腦」大分類中,共有多少 部門別?在PivotTable中,如該部門別沒有分配到大分類資源者,將不會列出部門別,故此欄會隨著大分類之不同,而做變動。


💙O1欄(=COUNTA(A:A)+1),為PivotTable樞鈕分析表之總列數  ,因為A欄為PivoteTable廠牌型號,逐列一一呈現,此O1欄的值,為手動填入COUNTA公式
此公式之目的主要為讓後續VBA程式,清楚掌握「個人電腦」大分類中,共有多少項?廠牌型號,此欄會隨著大分類之不同,而做變動(total_Rows)。

'####################################################################################

Sub ApplyFormula()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim total_Rows As Long
    Dim formulaRange As Range
    Dim i As Long
    
    '來源4個欄位,經過「樞紐分析表」,將資料預做梳理後,工作表名稱指定為Pivot_1
    Set ws = ThisWorkbook.Sheets("Pivot_1")
    
    '因「樞紐分析表」精靈產出後,上半段前3列已固定做標題列用途,故要扣除3後,每次下拉💛B1「財產設備大分類」後,才是實際⌈廠牌型號⌋之資料筆數。
    total_Rows = ws.Range("O1").Value - 3
    
    Sheets("Pivot_1").Select
    Columns("P:P").Select        '清空P欄,因為在下拉⌈財產設備大分類⌋,會貼不同的Formula
    Selection.ClearContents
     
    ' 預訂放置公式的起始處,預訂每次均由P5欄開始放置
    Set formulaRange = ws.Range("P5")
    
    
    ' 各列⌈廠牌型號⌋,詳列出 各個 "部門別"擁有之台數,逐一詳列出來
    For i = 1 To total_Rows    ' 第一列開始,直到最後一列
        '搭配Range & Formula ,方便每次於💛B1下拉「財產設備大分類,每列最後貼上公式
        formulaRange.Offset(i - 1, 0).Formula = "=IF($B" & i + 4 & ">0, $B$4&$B" & i + 4 & "&""台, "", """")" & _
                                                "&IF($C" & i + 4 & ">0, $C$4&$C" & i + 4 & "&""台, "", """")" & _
                                                "&IF($D" & i + 4 & ">0, $D$4&$D" & i + 4 & "&""台, "", """")" & _
                                                "&IF($E" & i + 4 & ">0, $E$4&$E" & i + 4 & "&""台, "", """")" & _
                                                "&IF($F" & i + 4 & ">0, $F$4&$F" & i + 4 & "&""台, "", """")" & _
                                                "&IF($G" & i + 4 & ">0, $G$4&$G" & i + 4 & "&""台, "", """")" & _
                                                "&IF($H" & i + 4 & ">0, $H$4&$H" & i + 4 & "&""台, "", """")"
                                '最後一列,為該大分類,各部門別彙整後之小計台數 (因為PivotTable樞鈕分析表已預先產製好)  ;最前方IF判斷式>0,即 台數>0,則顯示 部門別及台數。                                                                                                             
    Next i      
End Sub

 '&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

產出的結果 ( 💛B1欄「財產設備大分類」,下拉選擇⌈個人電腦⌋)

列標籤                 人事    財務   行政   銷售   研發    資訊

HP Pro SFF 400 G9     2         2         2        2         1          2  ,人事2台,財務2台....研發1台....(略)

ASUS S500TE                                           1               ,研發1台

 總計                     2         2         2        2         2          2  ,人事2台....................研發2台,資訊2台


'&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

PROMPT提示詞下法如下: (可將下面提示詞,貼至AI神器去詢問,取得VBA程式碼參考資訊)
處理前之樞鈕分析表,計有4欄位

篩選  拖曳  財產設備大分類、
欄    拖曳  部門別、
列    拖曳   廠牌型號、
值    拖曳    數量


經過「樞紐分析表」處理後,工作表名稱指定為Pivot_1
B1欄,為樞鈕分析表之篩選  財產設備大分類

excel表中,第4列為標題列,分別為 A4 廠牌型號、B4 人事、C4 財務、D4 行政、E4 銷售、F4 研發、G4 資訊H4 ,

T1欄,公式已設好  =COUNTA(4:4),為樞鈕分析表之總欄數
O1欄,公式已設好  =COUNTA(A:A)+1,為樞鈕分析表之總列數

下面公式為全數設備型號,我已將每列總數 放於 P5開始放置公式, 因為台數為0 ,就無需放入,請參考下面公式,寫VBA程式
    
    total_Rows = ws.Range("O1").Value - 3
    
    Sheets("Pivot_1").Select
    Columns("P:P").Select       
    Selection.ClearContents
     
    Set formulaRange = ws.Range("P5")
    
    For i = 1 To total_Rows    ' 第一列開始,直到最後一列
        '搭配Range & Formula ,方便每次於💛B1下拉「財產設備大分類,每列最後貼上公式
        formulaRange.Offset(i - 1, 0).Formula = "=IF($B" & i + 4 & ">0, $B$4&$B" & i + 4 & "&""台, "", """")" & _
                                                "&IF($C" & i + 4 & ">0, $C$4&$C" & i + 4 & "&""台, "", """")" & _
                                                "&IF($D" & i + 4 & ">0, $D$4&$D" & i + 4 & "&""台, "", """")" & _
                                                "&IF($E" & i + 4 & ">0, $E$4&$E" & i + 4 & "&""台, "", """")" & _
                                                "&IF($F" & i + 4 & ">0, $F$4&$F" & i + 4 & "&""台, "", """")" & _
                                                "&IF($G" & i + 4 & ">0, $G$4&$G" & i + 4 & "&""台, "", """")" & _
                                                "&IF($H" & i + 4 & ">0, $H$4&$H" & i + 4 & "&""台, "", """")"                                                                                                      
    Next i      



相關參考資訊:

EXCEL VBA 

樞鈕分析表查詢運用


2024年4月14日 星期日

透過AI神器(Gemini)生成Pythonista程式開發工具之專家

透過AI神器(Gemini)生成Pythonista程式開發專家,協助給予PYTHON程式建議

PROMPT生成專家提示詞,如下(藍色部分),請將它貼至AI神器 去詢問,再加入自己想瞭解的程式需求元素(如:Motion模組)


You are An experienced iPhone user and a master of Pythonista,
You can create development environments for iOS that include a built-in Python interpreter.
Reference Apple Developer Documentation and Pythonista official resources to provide python programming advice
 Or via Google engine to query
 or other relevant websites that meet your needs and refer to professional information from different countries (USA, Japan, Chinese) to provide relevant setting suggestions.
 For example:
 https://github.com/DocVaughan/Pythonista/blob/master/Examples/Overview.md
 https://github.com/topics/pythonista3
 http://omz-software.com/pythonista/

Please provide step-by-step instructions.
 
Points to Notes: Detailed step-by-step explanation (Pythonista, supported programming language introduction, function description, recommended PYTHON program example combined with iPhone and specific reasons, etc.)
Finally, please find popular information related to my needs on YouTube video websites (USA, Japan, Chinese).
 
 
"""
Needs: Please according my needs to provide python code for iPhone via Pythonista

give some sample python code (motion) to using motion module for iphone
 
"""


AI提供程式碼,如下: (可即時捉取iPhone水平、垂直數據)
import motion
import time

# Start updates from the motion sensors
motion.start_updates()

while True:
  # Get current accelerometer data (取得手機傳感數據)
  x, y, z = motion.get_gravity()

  # Print the accelerometer values
  print(f"X: {x} \n ,Y: {y}\n,Z: {z} \n\n")

  # Wait for a short interval before next reading (每0.3秒更新數據)
  time.sleep(0.3)

# Stop motion updates
motion.stop_updates()


使用前提:需先備妥PYTHON環境於iPhone上

Pythonista程式為付費軟體,Apple Store線上購買約新臺幣320元,可於iPhone上執行PYTHON程式

gemin-1.5-pro Model 實測結果,Gemini提供範例程式,可正常運作。

使用說明:請將您的需求,填寫於提示詞 Needs:  處即可。





2023年12月29日 星期五

用PYTHON程式,解析XML文件檔案資訊

XML檔,文字編輯器打開,出現一堆HTML標記<>對稱TAG資訊,如何簡單去除TAG資訊方便我們解讀?
可透過下面PYTHON程式(BeautifulSoup模組)進行解析查看

右鍵傳送至XmlParser.py  快速傳遞檔案參數,直接轉換快速作法:
步驟一: 開始| 執行 | Sendto:shell  , (即  C:\Users\YourName\AppData\Roaming\Microsoft\Windows\SendTo  )
步驟二: 將下面程式另字成 XmlParser.py(右鍵傳送到桌面當成捷徑,產生lnk檔) ,並將該lnk檔案複製到上面SendTo資料夾內  
步驟三: 點選您欲轉換之XML檔案,並按右鍵,指定給 XmlParser,即可快速執行XML格式檔案檢視


import sys
from bs4 import BeautifulSoup

def remove_html_tags(html):
    soup = BeautifulSoup(html, 'html.parser')
    text = soup.get_text(separator='\n', strip=True)
    return text

def process_xml_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as file:
        xml_data = file.read()
        # 假設 XML 内容位於 BODY 標記中,則可將其提取出来
        start_index = xml_data.find("<BODY>") + len("<BODY>")
        end_index = xml_data.find("</BODY>")
        xml_body = xml_data[start_index:end_index].strip()

        #  移除 HTML 標記,並整理為可讀性文本
        text_content = remove_html_tags(xml_body)

        # 產出結果至螢幕
        print(text_content)
        
        #將畫面將時暫停,方便複製下來,貼到EXCEL去分析,並按任意鍵後離開
        input("Press any key to continue!")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python XmlParser.py <xml_file_path>")
        sys.exit(1)

    xml_file_path = sys.argv[1]
    process_xml_file(xml_file_path)

 

XML格式開放資料集查詢:

 展覽資訊、電影資訊、演唱會資訊


No-Break Space 不換行空格 之處理 ChrW(160)

情境:
因原自網頁來源資料,內含NBSP不換行空格(即 &nbsp; ) ,故藉由 PYTHON程式去除 空白特殊字元,
才不會看起來一樣,但對電腦(如:EXCEL之vlookup比對函數)來說,後面多個空白字元,就是2個不同的字串值。


import os
import sys

def replace_string_in_file(file_path):
    # 讀取欲去處理之原始檔案內容
    with open(file_path, 'r', encoding='utf-8') as file:
        content = file.read()

    # 替換NBSP特殊字元
    replaced_content = content.replace('&nbsp;', '')

    # 取得原檔案的檔名和副檔名
    file_name, file_extension = os.path.splitext(file_path)

    # 產生新檔案名稱( 原檔名_1 )
    new_file_name = file_name + '_1' + file_extension

    # 寫入去除空白字元後的內容,到新檔案
    with open(new_file_name, 'w', encoding='utf-8') as new_file:
        new_file.write(replaced_content)

    print(f"已完成去除空白字元,並產製新檔:{new_file_name}")


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python RemoveNSPF.py <Original_file_path>")
        sys.exit(1)

    nspf_file_path = sys.argv[1]
    replace_string_in_file(nspf_file_path)



相關查詢:

No-Break Space 不換行空格 ChrW(160)

如何檢視空白CRLF換行等特殊字元神器? 可透過Notepad++文字編輯器,查看 檢視(V) | 特殊字元 | 顯示所有字元

空白字元導致vlookup查詢函數失敗,因此需將NBSP特殊字元予以去除

IDSP ,Ideographic Space (0x3000)

2023年12月24日 星期日

Wav to Txt 聲音檔案轉換成純文字檔 (逐字稿)

 情境:逐字稿 公司提供開完會後之WAV錄音檔,想轉換成純文字檔,節省打字時間


需預先載入:語音辨識相關套件

pip install SpeechRecognition



以下為PYTHON程式:

import os,sys
import subprocess


import speech_recognition as sr

# language='ja-JP' 可改成辨識日文語系; language='en-US' 可改成辨識英文語系
def convert_audio_to_text(audio_file):
    recognizer = sr.Recognizer()
    with sr.AudioFile(audio_file) as source:
        audio = recognizer.record(source)
    try:
        text = recognizer.recognize_google(audio,
language='zh-TW')
        return text
    except sr.UnknownValueError:
        return "無法辨識音訊"
    except sr.RequestError:
        return "無法連接到語音識別服務"


#'開啟GUI 取得來源檔(準備欲轉換聲音來源,開啟檔案對話視窗宣告處理)
import tkinter as tk
from tkinter import filedialog

root = tk.Tk()
root.withdraw()

# 取得轉換聲音,轉成純文字檔來源資訊
file_path = filedialog.askopenfilename(initialdir = "/",title = "Select file for OCR (選擇欲辨識聲音檔轉文字檔)",filetypes = (("Audio files","*.wav"),("All files","*.*")))

text1 = convert_audio_to_text(file_path)
print(text1)

with open('wavfile.txt', mode = 'w') as f:
    f.write(text1)
    f.close()

#將剛產出之文字檔,直接開啟顯示出來

subprocess.Popen('explorer "wavfile.txt"')


其它辦識資源 聲音轉換成純文字:
OpenAI (whisper)
 

其它轉換成文字相關工具:
圖檔轉換成文字檔 (Jpg to txt)

2023年12月23日 星期六

以PYTHON執行,經由langchain代理程式介接,使用CHATOPEN AI服務

langchain代理程式介接功能,雷同 瀏覽器add-on外掛程式 或 EXCEL增益集功能概念

下面為PYTHON程式,經由langchain代理程式介接,使用CHATOPEN AI服務

from langchain.chat_models import ChatOpenAI

#llm = ChatOpenAI(openai_api_key="...  此處需將最前面註解#去除,並將您在CHATOPEN產的API金鑰值,貼在此處以便讓您有權存取使用AI服務")

# 大型語言模型LLM 參數匯入糸統
from langchain.llms import OpenAI

# LLM 參數,查詢參數精準度初始化調整
llm = OpenAI(temperature=0.7)

# 輸入您欲查詢之資訊
text = "請摘要說明Langchain Agent,可提供界接雲端服務有哪些 (如:wolfram、chatopenai、serpapi agent)? 請列舉幾個生活上實用範例"

# 經由LLM 及ChatOpenAI服務,將詢問結果產出
prediction = llm(text)
print(prediction.strip())


程式產出結果:  (等同在瀏覽器下 PROMPT提示資訊手動詢問AI:請摘要說明Langchain Agent,可提供界接雲端服務有哪些 (如:wolfram、chatopenai)? 請列舉幾個生活上實用範例)

Langchain Agent是一種人工智能平台,其主要功能是提供界接雲端服務。它可以幫助用戶快速接入各種雲端服務,提供更加便捷和高效的使用體驗。Langchain Agent可以提供的界接雲端服務包括:

1. Wolfram:Wolfram是一個強大的數據分析和計算平台,它可以幫助用戶解決各種數學和科學問題。Langchain Agent可以幫助用戶接入Wolfram,讓用戶可以直接在Agent的界面上進行數據分析和計算,無需打開瀏覽器或下載軟件。

2.ChatOpenAI:它是一個開放式人工智能平台,可以提供自然語言處理、對話式機器人、語言翻譯等功能,開發人員可以通過Langchain AI程式庫輕鬆與ChatOpenAI進行交互,從而實現智能對話機器人等應用。


後記:

一、使用CHATGPT服務需要存取使用權,故需取得API KEY,並貼在程式中 或 設定openai_api_key 變數值於電腦系統環境變數中。

二、匯入必要之函式庫 ,備妥執行環境,如: 

pip install langchain
三、如此PYTHON程式,就可自動化去運用AI功能,而不用瀏覽器去操作詢問了 

 



2023年12月22日 星期五

用PYTHON程式協助products sampling抽驗順位決策


情境:
商品抽驗順位決策參考,

希望依不同部門別,對其業管的商品進行抽樣檢查,
並優先對較久沒被 抽驗過之商品進行查驗,且如果累計抽查次數較多,則將抽驗順位向後調整,
依部門別,每次提供建議抽查之6樣商品


此種用法不限對抽驗商品名稱,亦可用在業務稽核用途;只要將,部門別 換做為總經理室、人事室、會計室 ,而商品名稱 換做 同仁姓名 ,可增加公平性

(抽驗商品資訊如下,有生鮮部、熟食部、及零食部,各自有抽驗過紀錄)

部門   商品名稱  抽查日     累計抽查次
生鮮部    海鮮    1121201       4
生鮮部    貢丸    1121102     2
生鮮部    甜不辣    1121002     1
生鮮部    凍豆腐    1120903     1
生鮮部    花枝丸    1120801        1
生鮮部    黑輪    1120703     1
生鮮部    海鮮    1120603        4
生鮮部    魚丸    1120503     1
生鮮部    海鮮    1121201     1
生鮮部    貢丸    1121102     1
生鮮部    甜不辣    1121002     1
生鮮部    凍豆腐    1120903     1
熟食部    羊肉串    1121201     1
熟食部    雞肉串    1121102     1
熟食部    肉包    1121002     2
熟食部    菜包    1120903     3
熟食部    炒飯    1120801     2
熟食部    炒麵    1120703     1
熟食部    雞塊    1120603        1
熟食部    肉包    1120603     2
熟食部    菜包    1120503       3
熟食部    烤玉米    1120401     4
零食部    花生    1121101     6
零食部    蜜餞    1121001     5



PROMPT提示訊息下法: (AI協助寫PYTHON程式)
針對D:\samplingLIST.csv,每列資料分別為部門別、 商品名稱、 抽檢日、累計抽驗數,
請以PYTHON程式, 協助分析提供下次優先抽驗商品名稱,
依部門別進行分類後,各自提供建議優先抽驗商品名稱,列出6商品,
請以 抽檢日為主要判斷,找出 商品名稱 最少被抽驗到的商品列為最優先抽驗,
以累計抽驗數為次要判斷,亦即次數較高者,則抽驗順位向後

最後,請將結果放置於 D:\samplingOUTPUT.TXT,分別為 每部門別及  分別列出6件建議優先抽驗商品名稱。

產出結果,如下:   (減少漏網出錯,並提昇工作效率)
熟食部
烤玉米
雞塊
炒麵
炒飯
雞肉串
羊肉串


生鮮部
魚丸
黑輪
花枝丸
凍豆腐
甜不辣
貢丸


零食部
蜜餞
花生 


import csv
#自D:\samplingLIST.csv 載入檔案,略過標題列
with open('D:/samplingLIST.csv', newline='', encoding='UTF-8') as csvfile:
    reader = csv.reader(csvfile)
    header = next(reader)  # 略過標題列
    data = [row for row in reader]

# 按部門、檢查日期和累计檢查次數,對資料進行排序
data.sort(key=lambda x: (x[0], x[2], int(x[3])))

# 對分類資料進行反覆運算,並跟蹤每樣產品的檢測次數
inspections = {}
for row in data:
    department = row[0]
    product = row[1]
    if department not in inspections:
        inspections[department] = {}
    if product not in inspections[department]:
        inspections[department][product] = {'inspection_count': 0, 'inspection_dates': set()}
    inspections[department][product]['inspection_count'] += 1
    inspections[department][product]['inspection_dates'].add(row[2])

# 每個部門,提供至少的六個優先檢查產品清單,產出結果到
samplingOUTPUT.TXT  
with open('D:/samplingOUTPUT.TXT', 'w', encoding='UTF-8') as outfile:
    for department in inspections:
        outfile.write(f"\n\n{department}\n")
        sorted_products = sorted(inspections[department], key=lambda x: (len(inspections[department][x]['inspection_dates']), inspections[department][x]['inspection_count']))
        for product in sorted_products[:6]:
            outfile.write(f"{product}\n")

 

後記:

一、一開始是用VBA程式,但TRY了近10次都出現RUNTIME ERROR,改用PYTHON程式,1次就處理完成也沒有BUG,只要抽驗歷史紀錄持續更新,今後哪個最久沒被抽驗商品,也就無所遁形了😏。

二、PYTHON程式要讀檔類型為UTF-8編碼,可透過NOTEPAD++之主選單  編碼(N) | 轉成UTF-8 | 存檔至 D:\samplingLIST.csv

2023年12月16日 星期六

EXCEL VBA常用參考資訊

EXCEL VBA運用框架關鍵資訊

應用程式(Application),Microsoft Excel 是一個應用程式,它可以打開並編輯工作簿,每個工作簿可以包含多個工作表。


工作簿(Workbook):Excel 文件的容器,可以包含多個工作表。一個工作簿可以包含多個工作表,並且可以進行保存、打開和編輯。

工作表(Worksheet):Excel 中的一個分頁,用於方便歸納分類和存儲數據用途頁籤。每個工作簿可以包含多個工作表。工作表包含由列和欄組成的單元格(小方格)。


儲存格(Cell):工作表中的一個方格,用於存儲數據。每個儲存格由列和行交叉形成,可以包含文本、數字、公式等。

 
列(Column):工作表中的垂直方向的一系列儲存格。每一列由字母表示,例如 A、B、C 等。


行(Row):工作表中的水平方向的一系列儲存格。每一行由數字表示,例如 1、2、3 等。

 
範圍(Range):工作表中的一個連續儲存格的集合。範圍可以是單個儲存格,也可以是多個相鄰儲存格的組合,它亦是指定套用公式之範圍 的設定小幫手。


參考範例 (將多個工作簿儲存後,並將它關閉工作簿儲存後,並將它關閉)
For Each wbs In Application.Workbooks
   wbs.Save
Next wbs
Application.Quit

Windows("活頁簿1").Activate          'EXCEL預設開啟,即為工作簿(或活頁簿)
    ActiveWindow.Close


參考範例
ActiveWorkbook.SaveAs "C:\Test.xls"

With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = ThisWorkbook.Path & "\"
.Title = "開啟檔案對話窗格"

參考範例
Set ws1 = ThisWorkbook.Worksheets("工作表1")
lastRow1 = ws1.Cells(ws1.Rows.Count, 2).End(xlUp).Row  ' 左邊為列的計數;右邊數字2,代表B欄位,取得最後列的資料筆數,回傳給lastRow1變數


參考範例
Workbooks("Test.xls").Worksheets("工作表1").Range("A1").Value = 88

Range("A1").Select
ActiveCell.Value = 88  '目前儲存格A1,被選取的值,指定為88


執行外部程式(如:可執行預先寫好的Batch批次檔(OOO.bat)或讓EXCEL透過SHELL,直接執行PYTHON程式,如下面範例)

Shell "python c:\DoSomething.py", vbNormalFocus          'EXCEL去執行外部PYTHON應用程式



Application.DisplayAlerts = False
'控制 Excel 應用程式是否顯示警告訊息。
ActiveWindow.SelectedSheets.Delete
'設定刪除選定 頁籤時,不會有警告。


Application.ScreenUpdating = False
'控制 Excel 應用程式是否更新螢幕顯示。

Application.EnableEvents = True
'控制 Excel 應用程式,將會觸發各種事件,例如工作表的更改事件、工作簿的打開和關閉事件等。亦即,當您在 VBA 程式中設置了一個工作表的更改事件,該事件將會被觸發,並且相應的程式碼將被執行。 

Application.CutCopyMode = False
 '清除剪貼簿中的內容

     
Application.StatusBar = "正在更新資料..."
' 進行資料更新的程式碼,於下方狀態列,告知使用者EXCEL仍在更新資料


On Error Resume Next
'當程式碼執行遇到錯誤時,會忽略該錯誤並繼續執行下一行程式碼。

On Error GoTo Label01 
'當程式碼執行遇到錯誤時,會將控制權轉移到指定的錯誤處理程式碼 (Label01:)。




公式(Formula),自動貼在整A1到A100儲存格,貼上公式,省去拖拉之處理時間

Sub DuplicateFormulaFlag()
    Dim ws As Worksheet
    Dim rng As Range
    Dim cell As Range
    
    ' 設定要操作的工作表
    Set ws = ThisWorkbook.Worksheets("Sheet1") ' 修改為你的工作表名稱
    
    ' 設定要操作的範圍
    Set rng = ws.Range("A1:A100")
    
    ' 使用 For Each 迴圈逐一處理每個儲存格
    For Each cell In rng
        ' 將公式貼上儲存格
        cell.Formula = "=IF(COUNTIF(" & rng.Address & "," & cell.Address & ")>1,""重複"",""沒重複"")"
    Next cell
End Sub




檢查File是否存在函數
      Private Function FileExists(fname) As Boolean '判斷Excel檔是否存在
'   Returns TRUE if the file exists
        Dim x As String
        x = Dir(fname)
        If x <> "" Then FileExists = True _
        Else  FileExists = False
End Function


常用函數

VLOOKUP函數,是一個簡單的垂直查找所要查「特定字串值 」,並可回傳查找值在第一列中的匹配,對應相對位置之陣列值
(如:查找姓名,依其對應陣列中同列欄位位置資訊,如:身份證號;或可透過查此函數,與其它工作表之相對資訊,比對查看「特定字串值」,是否為在職人員等)。
INDEX與MATCH函數提供更靈活的查找和檢索功能,可以根據多個條件進行查找並返回更多的結果。





Excel表,第1列為標題列,請在工作表1 ,請協助用VBA程式,將所有 工作表1 中之空白列全數刪除,並以B欄做為判斷資料是否為空值


Sub DeleteActiveEmptyRows()   '刪除  作動中之工作表,所有空白列
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim sheetName As String
    sheetName = ActiveSheet.Name
    
    ' 取得作動中之  工作表
    Set ws = ThisWorkbook.Worksheets(sheetName)
      
    ' 取得最後一列的行數 (2代表,以B欄位做為研判資料筆數基準)
    lastRow = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
    
    ' 從最後一列往上檢查每一列的B欄是否為空值,如果是則刪除該列
    For i = lastRow To 2 Step -1
        If ws.Cells(i, 2).Value = "" Then
            ws.Rows(i).Delete
        End If
    Next i
End Sub


進階資訊:

EXCEL 可自行撰寫類別元件,檔案類型為.cls,經由模組(Module)中之巨集程式,將其呼叫執行
例如下面為AI,撰寫出64位元上網VBA CLASS元件,所以EXCEL執行如RS-232 數據通訊CLASS元件應該也不是難事
Private Declare PtrSafe Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal Agent As String, ByVal AccessType As LongPtr, ByVal ProxyName As String, ByVal ProxyBypass As String, ByVal Flags As LongPtr) As LongPtr

Private Declare PtrSafe Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As LongPtr, ByVal ServerName As String, ByVal ServerPort As Integer, ByVal UserName As String, ByVal Password As String, ByVal Service As LongPtr, ByVal Flags As LongPtr, ByVal Context As LongPtr) As LongPtr
    

Private Declare PtrSafe Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As LongPtr) As Boolean
    

Private Declare PtrSafe Function InternetReadFile Lib "wininet.dll" (ByVal hConnect As LongPtr, ByVal Buffer As String, ByVal NumberOfBytesToRead As LongPtr, NumberOfBytesRead As LongPtr) As Boolean
    

Private Declare PtrSafe Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As LongPtr, ByVal Verb As String, ByVal ObjectName As String, ByVal Version As String, ByVal Referer As String, ByVal AcceptTypes As LongPtr, ByVal Flags As LongPtr, Context As LongPtr) As LongPtr


串列通訊傳輸元件

Private Declare PtrSafe Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA" _
    (ByVal lpDef As String, lpDCB As DCB) As Long

    

PROMPT提示訊息下法: 

請寫VBA程式,運用上面元件(BuildCommDCBA),執行RS-232傳輸測試

文字檔有網頁開啟清單,用PYTHON程式,將網頁全數開啟,並找出特定字串,將其另存至文字檔中

情境說明:

PROMPT提示訊息下法:   (範例2) 

D:/HyperLinkSource.txt 此檔案內含連結位址,請用PYTHON寫程式,CHROME瀏覽器,開啟該文字檔案全數連結,並按任意鍵繼續瀏覽下個頁面


import webbrowser

# 读取文本文件中的链接
file_path = 'D:/HyperLinkSource.txt'

with open(file_path, 'r') as file:
    # 逐行读取链接
    for line in file:
        # 移除行尾的换行符
        url = line.strip()
        
        # 使用webbrowser模块打开链接
        webbrowser.open(url)
        
        # 等待用户按下任意键继续
        input("Press Enter to continue...")
         
 

 

PROMPT提示訊息下法:      (範例2) 

D:\HyperLinkSource.txt 此檔案內含連結位址,請用PYTHON寫一程式,運用requests與BeautifulSoup模組,以預設瀏覽器,開啟該文字檔案提供全數連結

,並請協助各自讀取每個連結之網頁內容後,將網頁內容中有包含  詳洽本公司: 開始 到  < 回訊息列表   間的字串值 將字串值取出至D:\BrowsingString.txt ,

該檔如存在請刪除,重新建檔,且該檔包含 該連結位址 及 網頁內容之特定字串,如找不到資料詳洽之特定字串,則用 找不到特定字串, 處理,並請接續處理下一筆連結之瀏覽檢視作業

import os
import requests
from bs4 import BeautifulSoup

# 讀取連結位址檔案
file_path = r'D:\HyperLinkSource.txt'
with open(file_path, 'r') as file:
    links = file.readlines()

# 刪除 output_file 若存在
output_file = r'D:\BrowsingString.txt'
if os.path.exists(output_file):
    os.remove(output_file)

# 開啟瀏覽器並處理每個連結
for link in links:
    link = link.strip()  # 移除連結前後的空白字符
    try:
        # 使用requests獲取網頁內容
        response = requests.get(link)
        response.raise_for_status()  # 確保獲取網頁成功
        webpage_content = response.text

        # 使用BeautifulSoup解析網頁內容
        soup = BeautifulSoup(webpage_content, 'html.parser')

        # 尋找特定字串值
        start_marker = '詳洽本公司:'
        end_marker = '< 回訊息列表'
        start_index = webpage_content.find(start_marker)
        end_index = webpage_content.find(end_marker)

        # 提取特定字串值
        if start_index != -1 and end_index != -1:
            substring = webpage_content[start_index + len(start_marker):end_index].strip()
        else:
            substring = '@@ 找不到特定字串'

        # 將特定字串值寫入檔案
        with open(output_file, 'a', encoding='utf-8') as file:
            file.write(f'{link}\n')
            file.write(f'{substring}\n\n\n')
    except requests.exceptions.RequestException as e:
        print(f'無法獲取連結:{link}')
        print(f'錯誤訊息:{e}')

後記:取出的網頁資訊,仍保留許多HTML語法資訊,故如要估資料再次運用,可能此方法不是最佳方式,只是測試PYTHON程式,捉取網頁內容特定2關鍵字,將其抽取出至另1個文字檔D:\BrowsingString.txt

EXCEL 同產品名稱 ,銷售金額 ,用VBA程式查詢


EXCEL表中,分別有訂單編號、訂購日期、產品名稱、單價、數量、小計等欄位,
想瞭解下表中  同一產品名稱 ,其銷售一共多少錢?


   A          B            C         D       E        F   
訂單編號    訂購日期    產品名稱    單價    數量    小計
A0001        112/5/1        鉛筆           20        6        120
A0002        112/6/6        原子筆        30        2        60
A0003        112/7/7        剪刀           46        2        92
A0004        112/6/8        美工刀        40        2        80
A0005        112/8/9        鉛筆           20        4        80
A0006        112/6/10     橡皮擦        15        2        30
A0007        112/9/9        精美提袋    80        3        240
A0008        112/9/12      原子筆        30        4        120
A0009        112/10/13    剪刀           46        2        92
A0010        112/11/15    鉛筆           20        2        40


藉由AI(ChatGPT)協助將同一產品名稱,歸納成同一群組後,彙總成單筆銷售數量。
PROMPT提示訊息下法:
EXCEL表中,有訂單編號、訂購日期、產品名稱、單價、數量、小計欄,請以EXCEL VBA程式,將相同 產品名稱 進行排序,歸納為同一群組,並將 相同產品名稱 彙集成1筆 單價及數量,
結果分別存放至    I2欄為產品名稱 J2欄為單價 K2欄為相同品項數量加總


Sub 彙集產品資料()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim productName As String
    Dim price As Double
    Dim quantity As Long
    Dim summaryRow As Long

    ' 設定工作表,這裡假設資料在第一個工作表
    Set ws = ThisWorkbook.Sheets(1)

    ' 找到最後一行
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 初始化目標列
    summaryRow = 2 ' 假設第一行是標題,從第二行開始

    ' 按照產品名稱進行排序
    ws.Sort.SortFields.Clear
    ws.Sort.SortFields.Add Key:=ws.Range("C2:C" & lastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With ws.Sort
        .SetRange ws.Range("A1:F" & lastRow)
        .Header = xlYes ' 假設有標題行
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With

    ' 循環處理每一行資料
    For i = 2 To lastRow ' 假設第一行是標題,從第二行開始

        ' 取得產品名稱
        productName = ws.Cells(i, 3).Value ' 假設產品名稱在第3欄

        ' 取得單價和數量
        price = ws.Cells(i, 4).Value ' 假設單價在第4欄
        quantity = ws.Cells(i, 5).Value ' 假設數量在第5欄

        ' 如果是相同的產品名稱,則彙集數據
        If productName = ws.Cells(summaryRow, 9).Value Then
            ' 加總數量
            ws.Cells(summaryRow, 11).Value = ws.Cells(summaryRow, 11).Value + quantity
        Else
            ' 新的產品,將結果寫入新的一行
            summaryRow = summaryRow + 1
            ws.Cells(summaryRow, 9).Value = productName ' 產品名稱
            ws.Cells(summaryRow, 10).Value = price ' 單價
            ws.Cells(summaryRow, 11).Value = quantity ' 數量
        End If
    Next i

End Sub



請按照以下步驟使用此程式:
STEP1:開啟您的Excel檔案。
STEP2:按下Alt + F11進入VBA編輯器。
STEP3:在VBA編輯器中,插入一個新的模組Module。
STEP4:將上述VBA程式碼,複製並貼上到新的模組Module中。
STEP5:在VBA編輯器中,按下F5運行程式。


相關可運用AI工具輔助寫程式資源