Code xử lý chuỗi ký tự

Trạng thái
Không mở trả lời sau này.

Euler

Administrator
Thành viên BQT
File demo:

INPUT: Là một file word có nội dung như sau:
Bạn cần đăng nhập để thấy đính kèm


OUTPUT: Mong muốn ra như sau:
Mã:
\begin{cau}
\begin{enumerate}
\item Cau dan 1
    \begin{enumerate}
    \item Cau nho 1
    \item Cau nho 2
    \item Cau nho 3
      \end{enumerate}
\item Cau dan 2
\begin{listEX}[3]
    \item Cau nho   
\item Cau nho   
\item Cau nho
\end{listEX}
\item Cau dan 3
    \begin{enumerate}
\item Cau nho co nhieu y
\begin{enumerate}
\item Y nho
\item Y nho
          \end{enumerate}
    \item Cau nho co nhieu y
    \begin{enumerate}
\item Y nho 2
\item Y nho 2
    \begin{enumerate}
\end{Cau}
%%============================%%
\begin{cau}
\begin{enumerate}
\item Cau dan 1
    \begin{enumerate}
    \item Cau nho 1
    \item Cau nho 2
    \item Cau nho 3
      \end{enumerate}
\item Cau dan 2
\begin{listEX}[3]
    \item Cau nho   
\item Cau nho   
\item Cau nho
\end{listEX}
\item Cau dan 3
    \begin{enumerate}
\item Cau nho co nhieu y
\begin{enumerate}
\item Y nho
\item Y nho
          \end{enumerate}
    \item Cau nho co nhieu y
    \begin{enumerate}
\item Y nho 2
\item Y nho 2
    \begin{enumerate}
\end{Cau}
Output ghi ra biến string s để kiểm chứng.
 
Câu hỏi 1: Bắt đầu item luôn có cấu trúc là:

số .
Ví dụ: 1. , 2. , 3.

chữ )
Ví dụ: a), b) ...

Vậy nếu tôi coi đây là dấu hiệu bắt đầu của một item thì có được không:
Vị trí một item luôn ở đầu dòng hoặc trước nó có dấu tab( có thể là tab + khoảng trắng-sẽ chuẩn hóa sau), và nó có cấu trúc là số . hoặc chữ )
 

Euler

Administrator
Thành viên BQT
Câu hỏi 2: Tôi nghĩ hỏi như sau sẽ tổng quát hơn câu hỏi 1.
File ví dụ của bên yêu cầu chỉ có một định dạng là Numbering (Cái này có thể dùng VBA để kiểm tra, khi đó có lẽ không cần dấu hiệu nhận biết như câu hỏi 1 nêu. Vì cái này nó có thuộc tính, code có thể đọc được thuộc tính và xác định nó có phải là list hay không.
Nhưng các ví dụ mà bên yêu cầu đưa ra đều chỉ sử dụng Numbering.
Câu hỏi: Code chỉ phải xử lý định dạng Numbering có đúng không?
Bạn cần đăng nhập để thấy đính kèm
 

mathvn

Yêu THVBA
Câu hỏi 1: Bắt đầu item luôn có cấu trúc là:

số .
Ví dụ: 1. , 2. , 3.

chữ )
Ví dụ: a), b) ...

Vậy nếu tôi coi đây là dấu hiệu bắt đầu của một item thì có được không:
Vị trí một item luôn ở đầu dòng hoặc trước nó có dấu tab( có thể là tab + khoảng trắng-sẽ chuẩn hóa sau), và nó có cấu trúc là số . hoặc chữ )
Do môi trường enumerate của LaTeX sẽ tự dạng các số này nên chỉ cần bắt đầu 1., 1), 1/, I., I), I/, a., a),... chuyển về \begin{enumerate} \item là ok.
Vấn đề kết thúc các môi trường con đúng vị trí mới khó. Có thể có câu hỏi có đến 3 môi trường lồng vào nhau.
 

mathvn

Yêu THVBA
Câu hỏi 2: Tôi nghĩ hỏi như sau sẽ tổng quát hơn câu hỏi 1.
File ví dụ của bên yêu cầu chỉ có một định dạng là Numbering (Cái này có thể dùng VBA để kiểm tra, khi đó có lẽ không cần dấu hiệu nhận biết như câu hỏi 1 nêu. Vì cái này nó có thuộc tính, code có thể đọc được thuộc tính và xác định nó có phải là list hay không.
Nhưng các ví dụ mà bên yêu cầu đưa ra đều chỉ sử dụng Numbering.
Câu hỏi: Code chỉ phải xử lý định dạng Numbering có đúng không?
Bạn cần đăng nhập để thấy đính kèm
Không đúng trong thực tế. Một số người dùng list, một số dùng thủ công, một số pha lẫn. Do đó code tổng quát là convert numer to text (ConvertNumbersToText) để xử lý. Lưu ý một số câu như: cho $y=mx^2+n, (m\ne n)$ thì nhận dạng n) thành item là sai.
Thêm nữa, người dùng không chuẩn rất dễ sai list. Ví dụ ý b) của 2. ở câu hai nằm ở 2 list khác nhau.
 

NhanSu

SMod
Thành viên BQT
Mình nghĩ khó có thể tổng quát trừ khi biết trước các câu không có dấu xuống dòng. Giả thiết chỉ có thể chấp nhận với đề toán, gặp bài thơ hay bài luận English là hỏng.
Nếu giả thiết trên đúng thì convert toàn bộ file word thành normal text, replace tab thành ^p rồi đọc từng dòng.
 

mathvn

Yêu THVBA
Mình nghĩ khó có thể tổng quát trừ khi biết trước các câu không có dấu xuống dòng. Giả thiết chỉ có thể chấp nhận với đề toán, gặp bài thơ hay bài luận English là hỏng.
Nếu giả thiết trên đúng thì convert toàn bộ file word thành normal text, replace tab thành ^p rồi đọc từng dòng.
Giới hạn là làm trong văn bảng toán ah.
 

Euler

Administrator
Thành viên BQT
1. Vậy tôi nhận thức phải sử dụng dấu hiệu nhận biết như @thanhphong đã nêu.
Và logic dấu hiệu nhận biết mà câu hỏi 1 đặt ra đã được bên yêu cầu xác nhận là đúng. Nếu sai xin hãy phản hồi ngay.
2. Về phản biện của bạn:
$y=mx^2+n, (m\ne n)$ thì nhận dạng n) thành item là sai.
Phản biện trên là sai, xin chú ý trước n) phải là dấu tab hoặc vị trí nó phải ở đầu dòng (phía trên là dấu xuống dòng ^p ).
 

mathvn

Yêu THVBA
1. Vậy tôi nhận thức phải sử dụng dấu hiệu nhận biết như @thanhphong đã nêu.
Và logic dấu hiệu nhận biết mà câu hỏi 1 đặt ra đã được bên yêu cầu xác nhận là đúng. Nếu sai xin hãy phản hồi ngay.
2. Về phản biện của bạn:

Phản biện trên là sai, xin chú ý trước n) phải là dấu tab hoặc vị trí nó phải ở đầu dòng (phía trên là dấu xuống dòng ^p ).
Như đã nói, dấu hiệu bắt đầu là dễ, cái cần quan tâm là dấu hiệu kết thúc mới khó.
Ý thứ hai chắc phải có demo mới rõ. Khi copy paste sẽ có trường hợp mình đề cặp, trong quá trình xử lý tôi có gặp. Có lẽ code tôi viết chưa tốt.
 

NhanSu

SMod
Thành viên BQT
Thực ra đề toán cũng có thể có dấu xuống dòng, ta có thể replace tab thành xuống dòng. Có thể xác định bắt đầu câu hỏi là "Câu n.", bắt đầu câu dẫn là "n.", bắt đầu các ý là "abc)" ..., bắt đầu ý nhỏ là "i)"...
Nếu các đoạn text nào không bắt đầu bằng định dạng trên thì nó tiếp nối với đoạn liền trước trong cùng 1 ý.
 

vbano1

SMod
Thành viên BQT
Câu hỏi 3:
Bạn cần đăng nhập để thấy đính kèm

Tôi để ý phần chữ màu vàng tại sao môi trường của nó lại là listEX. Dấu hiệu nhận biết là gì?
Câu hỏi: Có phải các item viết trên cùng hàng (sử dụng dấu Tab) thì phải cho vào môi trường listEX. ?
 

mathvn

Yêu THVBA
Câu hỏi 3:
Bạn cần đăng nhập để thấy đính kèm

Tôi để ý phần chữ màu vàng tại sao môi trường của nó lại là listEX. Dấu hiệu nhận biết là gì?
Câu hỏi: Có phải các item viết trên cùng hàng (sử dụng dấu Tab) thì phải cho vào môi trường listEX. ?
Đúng rồi ah. Và số a), b), c) trên 1 dòng xác định số trong ngoặt vuông.
 

vbano1

SMod
Thành viên BQT
Đúng rồi ah. Và số a), b), c) trên 1 dòng xác định số trong ngoặt vuông.
Vậy, các item viết trên cùng hàng có cấu trúc 1. hoặc 1- hoặc 1/ hoặc a) , ii) và sử dụng dấu tab sẽ cho vào môi trường này. Nếu nhận thức của tôi là sai xin hãy phản hồi lại.
[3] là số item, tôi cũng đoán vậy.
 

Euler

Administrator
Thành viên BQT
1.Dấu hiệu nhận biết một item:
Nó có cấu trúc như sau:
Số: 1., 1), 1/
Chữ: a., a), a/ (chữ có thể là in hoa ha in thường)
Phía trước item là dấu tab hoặc dấu xuống dòng ^p
2. Nhận biết level của một item
Sau khi đã biết đây là một item, ta cần nhận biết level của một item.
Bạn cần đăng nhập để thấy đính kèm

Ta sẽ đo khoảng cách từ item ra lề trái. Khoảng cách nhỏ thì level thấp (ex. level 1).
Khoảng cách lớn thì là level cao (ex: level 2).
Khi chạy từ trên xuống ví dụ đang ở level 2.
Xuống dòng dưới gặp level1 thì level 2 sẽ được đóng.
Quy định từ khóa câu in đậm ở đầu dòng là level 0.
Như vậy nếu gặp level thấp thì level cao ở trước đó phải được đóng.
 
Sửa lần cuối:

mathvn

Yêu THVBA
Thực ra đề toán cũng có thể có dấu xuống dòng, ta có thể replace tab thành xuống dòng. Có thể xác định bắt đầu câu hỏi là "Câu n.", bắt đầu câu dẫn là "n.", bắt đầu các ý là "abc)" ..., bắt đầu ý nhỏ là "i)"...
Nếu các đoạn text nào không bắt đầu bằng định dạng trên thì nó tiếp nối với đoạn liền trước trong cùng 1 ý.
Làm thế này có thể hỏng ah. Các ý cùng dòng là môi trường khác.
Thứ hai, Một câu hỏi có thể có nhiều đoạn nên căn cứ bằng xuống dòng không phù hợp lắm.
Ví dụ; Câu 1) Giải bài toán sau bằng cách lập phương trình.
Bài toán....
a)
b)....
 

mathvn

Yêu THVBA
Vậy, các item viết trên cùng hàng có cấu trúc 1. hoặc 1- hoặc 1/ hoặc a) , ii) và sử dụng dấu tab sẽ cho vào môi trường này. Nếu nhận thức của tôi là sai xin hãy phản hồi lại.
[3] là số item, tôi cũng đoán vậy.
Số item có thể là bội của n vì câu hỏi có thể có rất nhiều ý.
Mỗi dòng có n ý. Căn cứ vào tab cũng được nhưng không chính xác lắm. Ví dụ trong file mẫu có chỗ người dùng gõ sai "a) tab nội dung"
 

Euler

Administrator
Thành viên BQT
Ví dụ trong file mẫu có chỗ người dùng gõ sai "a) tab nội dung"
Phản biện sai.
Nó phải là tab a) thì mới tính là item. Dấu tab phải ở trước item.
chú ý có thể có tình huống tab + khoảng trắng + a)
do đó sẽ có bước chuẩn hóa loại bỏ tab + khoảng trắng => tab.
 

NhanSu

SMod
Thành viên BQT
@mathvn mình không biết về latex từ trước nên mình chỉ dựa trên ví dụ mẫu ở trên để đóng góp ý kiến, các bác thông cảm. Vì đề bài có thể "a) <tab> b)" hoặc "a) <LF>
b)" nên có thể chuyển tab thành xuống dòng để xét cho nhanh.
Nếu có thể bắt đầu bằng "Câu n)" thì thêm nó vào các điều kiện tìm kiếm.
Các đoạn text (paragraph) không bắt đầu bằng các dấu hiệu trên thì là đoạn tiếp theo của ý trước.
 

mathvn

Yêu THVBA
Phản biện sai.
Nó phải là tab a) thì mới tính là item. Dấu tab phải ở trước item.
chú ý có thể có tình huống tab + khoảng trắng + a)
do đó sẽ có bước chuẩn hóa loại bỏ tab + khoảng trắng => tab.
Người dùng không gõ tab mà dùng backspace đến a) rồi gõ hoặc họ enter cách vào vài cái rồi gõ không dùng đến tab
 

vbano1

SMod
Thành viên BQT
Người dùng không gõ tab mà dùng backspace đến a) rồi gõ hoặc họ enter cách vào vài cái rồi gõ không dùng đến tab
Có thể thấy 8 dấu cách thành 1 phím tab. có thể thực hiện chuẩn hóa này trước khi làm việc. Bạn hãy xác nhận có đúng 8 dấu cách = 1 tab không nhé.
 
Trạng thái
Không mở trả lời sau này.
Top