Separare testi con caratteri arabi
Hai un problema con Excel? 
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 12:08:55
Ciao tutti,
Ho una lunga lista di parole miste di caratteri arabi e inglesi che vorrei separarli con tab o in due colonne, il problema è che sono separati con spazio. Ho provato di separare con Excel e word e con trova e sostituisci ma il risultato non viene bene.
Ho fatto due colonne in Excel e in uno ho eliminato caratteri latini e nell'altro ho eliminato carretti inglese, cosi ho due colonne separate, ma il risultato non è 100% buono perché c'è una Particolarità che in qualche riga tra testo arabo c'è qualche parola inglese e viceversa.
qua sotto mando un esempio del testo:
ابغض الحلال (طلاق) worst among permitted things (divorce)
ابقاء عهود سابق maintaining previous treaties
ابقاء قرارداد بیمه maintaining insurance contract
ابقاء قیمومیت maintaining guardianship (tutelage)
ابقاء کردن reinstate;retain
ابقاء مسئولیت maintaining the responsibility
Qualcuno sapere fornirmi una soluzione o una macro per separare ed avere la lista separate con tab o colonne in excel:
ابغض الحلال (طلاق) worst among permitted things (divorce)
ابقاء عهود سابق maintaining previous treaties
ابقاء قرارداد بیمه maintaining insurance contract
ابقاء قیمومیت maintaining guardianship (tutelage)
ابقاء کردن reinstate;retain
ابقاء مسئولیت maintaining the responsibility
grazie mille
far
di alfrimpa data: 13/07/2017 12:36:54
Ciao far
Non so se la cosa si possa fare; prova ad allegare un file di esempio con pochi record (ma con tutte le casistiche possibili) inserendo a mano il risultato desiderato.
Alfredo
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 13:13:32
grazie mille.
in allegato invio il file.
comqunque il 98% dei testi sono: testo arabo spazio testo inglese.
sono pochi che sono misti.
grazie mille
far
di Vecchio Frac data: 13/07/2017 13:26:22
Questo problema è davvero complesso...
Vediamo se riusciamo a trovare una soluzione accettabile.
di Vecchio Frac data: 13/07/2017 13:32:52
C'è anche un problema di separazione nel ricostruire questa tavola di traduzione, perchè nel file di esempio compare:
انفصال "word" از خدمت dismissal "کلمه" from service
da riportare così:
dismissal "کلمه" from service ----> in target
انفصال "word" از خدمت ----> in source
Io (Excel) ho difficoltà, nella frase originale, a stabilire un criterio per capire che "dismissal" è il punto di divisione.
di Vecchio Frac data: 13/07/2017 13:49:08
Sulla scorta dell'esempio, l'unica è leggere carattere per carattere e stabilire se è un carattere latino o arabo.
Inizierei da questo test.
edit by VF: posizionarsi su una cella della colonna A e lanciare la macro.
Option Explicit
Sub test()
Dim i As Long
Dim latin As String
Dim arabic As String
For i = 1 To Len(ActiveCell)
If AscW(Mid(ActiveCell, i, 1)) > 255 Then
arabic = arabic & Mid(ActiveCell, i, 1)
Else
latin = latin & Mid(ActiveCell, i, 1)
End If
Next
latin = Trim(latin)
arabic = Trim(arabic)
Range("A20") = latin
Range("A21") = arabic
End Sub |
di Vecchio Frac data: 13/07/2017 14:05:06
Segue una versione che tiene conto delle parentesi aperta e chiusa, e le assegna al testo arabo. Inoltre conserva anche il carattere di spazio nel testo arabo (la versione di prima eliminava gli spazi).
Option Explicit
Sub test()
Dim i As Long
Dim latin As String
Dim arabic As String
Dim char As String
Range("A20:A21").Clear
For i = 1 To Len(ActiveCell)
char = Mid(ActiveCell, i, 1)
If AscW(char) = 32 Then
latin = latin & char
arabic = arabic & char
End If
If AscW(char) > 64 And AscW(char) <= 255 Then
latin = latin & char
End If
If AscW(char) > 255 Or AscW(char) = 40 Or AscW(char) = 41 Then
arabic = arabic & char
End If
Next
latin = Trim(latin)
arabic = Trim(arabic)
Range("A20") = latin
Range("A21") = arabic
End Sub |
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 14:31:03
Grazie mille per macro.
Ho creato il file macro ma non funziona ancora. Ho messo la direzione della excel in RTL layout cosi si vede meglio. e poi ho inserito l'effetto desiderato. Forse ti aiuta meglio con la visualizzazione.
grazie ancora
far
di Vecchio Frac data: 13/07/2017 14:53:36
Allego una nuova versione, che adesso spezza l'analisi per tener conto anche delle virgolette e le assegna a inglese o arabo.
Io non ho impostato nessuna direzione: vedo correttamente le scritte da sinistra a destra.
Comunque questo codice sbaglia ancora ad analizzare per esempio la cella A5.
Dimmi se ci sono altre difficoltà.
Option Explicit
Sub test()
Dim i As Long
Dim latin As String
Dim arabic As String
Dim last As String
Dim char As String
Dim bquote As Boolean
Dim origin As Range
Range("A20:A21").Clear
Set origin = range(inputbox ("Inserisci la cella da analizzare in riferimento A1", "A1"))
For i = 1 To Len(origin)
char = Mid(origin, i, 1)
If bquote Then
If last = "latin" Then latin = latin & char Else arabic = arabic & char
End If
If AscW(char) < 65 Then
If Not bquote Then
If last = "latin" Then latin = latin & char Else arabic = arabic & char
End If
If AscW(char) = 34 Then
bquote = Not bquote
End If
End If
If AscW(char) > 64 And AscW(char) <= 255 Then
If Not bquote Then
latin = latin & char
last = "latin"
End If
End If
If AscW(char) > 255 Then
If Not bquote Then
arabic = arabic & char
last = "arabic"
End If
End If
Next
latin = Trim(latin)
arabic = Trim(arabic)
Range("A20") = latin
Range("A21") = arabic
End Sub
|
di Vecchio Frac data: 13/07/2017 14:58:47
Questo codice sbaglia anche con A7 perchè la parola کلمه (khamat?) è racchiusa da parentesi: se la metti tra virgolette viene correttamente assegnata.
di Vecchio Frac data: 13/07/2017 15:08:53
Allego una versione praticamente finale che esamina in automatico il range di celle originale e sistema la trasposizione nelle celle C e D... si può ottimizzare qualche passaggio ma non saprei ulteriormente affrontare meglio concettualmente questo problema :)
post scriptum: la correzione della cella A7 è necessaria (cioè racchiudere il testo arabo tra virgolette invece che parentesi) perchè altrimenti sballa la regola generale. Cioè le parole tra virgolette vengono assegnate al contesto corrente, arabo o inglese, in cui si trovano
Option Explicit
Sub test()
Dim i As Long
Dim latin As String
Dim arabic As String
Dim last As String
Dim char As String
Dim bquote As Boolean
Dim cel As Range
Range("C2:D1000").Clear
For Each cel In Range("A2:A100")
If Trim(cel) = "" Then Exit For
arabic = ""
latin = ""
bquote = False
last = ""
For i = 1 To Len(cel)
char = Mid(cel, i, 1)
If bquote Then
If last = "latin" Then latin = latin & char Else arabic = arabic & char
End If
If AscW(char) < 65 Then
If Not bquote Then
If last = "latin" Then latin = latin & char Else arabic = arabic & char
End If
If AscW(char) = 34 Then
bquote = Not bquote
End If
End If
If AscW(char) > 64 And AscW(char) <= 255 Then
If Not bquote Then
latin = latin & char
last = "latin"
End If
End If
If AscW(char) > 255 Then
If Not bquote Then
arabic = arabic & char
last = "arabic"
End If
End If
Next
latin = Trim(latin)
arabic = Trim(arabic)
cel.Offset(, 2) = arabic
cel.Offset(, 3) = latin
Next
MsgBox "All done."
End Sub
|
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 15:09:25
grazie.
Io purtroppo non riesco a farlo funzionare. Non sono molto esperto di macro. Quando faccio partire la macro mi chiede la cella e io metto A1 e poi mi copia le parole in a20 e poi a a21. Potresti modificare la macro in modo che mi copia le parole con carattere arabo nella colonna C e inglese in colonna D, poi ci sono circa 30 mila righe. In questo modo posso fare dei confronti e capire dove il codice sbaglia. Per i parentesi posso sostituirli prima di elaborazione con per esempio ||, perché virgolette ci sono già nel testo e non va bene.
grazie ancora
di Vecchio Frac data: 13/07/2017 15:13:53
L'ultimo post che ho messo fa quello chiedi, forse non lo hai visto :)
Per le parentesi: se introduci un nuovo carattere dovremo tenerne conto nel codice. Perchè dici che se le virgolette ci sono già "non va bene" ? Secondo me è bene tenerle come carattere di separazione del contesto.
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 15:31:58
Ho visto e adesso funziona quasi a meraviglia. devo ancora approfondire ma di quello che finora ho visto, funziona molto bene.
Poi vedo che con le parentesi su qualche riga funziona e su qualcuno no. Sono d'accordo che si deve tenerli come carattere di separazione, ma nel testo esistono anche parole racchiuse dentro virgolette e quindi se io nel source sostituisco parentesi con virgolette, allora si mischiano, quindi sarebbe meglio usare un carattere diverso come separazione forse possiamo usare []?
grazie mille
di Vecchio Frac data: 13/07/2017 15:42:38
Va bene. Fammi un paio di esempi (anche qui, non serve allegare un file) con i caratteri di separazione noti (virgolette, parentesi tonde e parentesi quadre). Sono contento del tuo feedback positivo :)
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 16:04:28
ecco qua sotto mando tutte le casistiche un pò strane. per sostituire le parentesi si dovrebbe usare un carattere diverso di quelli che stanno nel testo.
ابراء ضامن از دین-->discharge of guarantor (cautioner)
ابد (ابدی)-->perpetual
بیع ذهب به ذهب همراه با اضافه-->sale of gold for gold in the excess[al-fadi]
بیع مشروط-->executory/conditional/memorandum sale
بیمه اتکائی-->re-insurance
بیمه مسئولیت مدنی صاحبان حیوانات-->animals’ owner liability insurance
بَینّه تصرف-->witnesses who testify for the possession
تعهد صریح (در قرارداد)-->“express obligation obligation “”in deed””,express warranty”
سهام بدون حق رای (در مجامع)-->“non–voting shares,“”a”” shares”
un trovato un nuovo errore nella macro. praticamente copia apostrofo ’ nel testo arabo.
originale: اخذ توضیحات کارشناس obtaining expert’s explications
processato: اخذ توضیحات کارشناس ’-->obtaining experts explications
expert’s è diventato experts
grazie mille ancora
di Vecchio Frac data: 13/07/2017 16:08:55
Ok, è veramente difficile tener conto di tutto.
Mi serve un po' di tempo, abbi pazienza :)
di Vecchio Frac data: 13/07/2017 16:10:46
Nell'ultimo set di esempi, c'è proprio "-->" a separare arabo da inglese?
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 16:57:21
no, questi "-->" non esistono nel testo. Li ho messi io come come separatori del test, visto che qua i tab non funzionano.
di Vecchio Frac data: 13/07/2017 17:10:10
Negli esempi che fai ci sono parentesi aperte e non chiuse (testo in arabo), come in "ابد (ابدی)-->perpetual "
Questo secondo me è un problema dell'originale, e non so se si può risolvere con facilità.
O hanno un altro significato per te?
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 17:16:40
si, purtroppo il testo non è perfetto. Ci sono ogni tanto degli errori del genere. ci sono anche delle virgolette non chiuse, al limite se sono problematiche faccio una editing prima di processare con la macro.
di Vecchio Frac data: 13/07/2017 17:50:02
In realtà la coppia parentesi aperta - chiusa si può sistemare in automatico.
Per le virgolette invece è impossibile per un software stabilire dove devono essere chiuse.
Ma conto sul fatto che questi casi siano pochi.
Tu continua a fare test se hai tempo e vedi se ci sono altri casi problematici.
Io per adesso sono fermo perchè sono a casa e devo occuparmi della famiglia
di Vecchio Frac data: 13/07/2017 17:53:33
Inoltre ti chiedo scusa perchè io chiamo il testo "arabo" ma in realtà è "persiano", come vedo dal tuo secondo file allegato.
Abbi pazienza, perchè se c'è una differenza io non la conosco totalmente e quindi confondo le due realtà.
di Vecchio Frac data: 13/07/2017 17:58:54
cit: Ho messo la direzione della excel in RTL layout cosi si vede meglio. e poi ho inserito l'effetto desiderato. Forse ti aiuta meglio con la visualizzazione.
--> Ah ecco... capisco adesso cosa intendevi... il secondo file allegato è orientato da destra a sinistra :)
E' un po' sconcertante per me così ma se per te è naturale mi adeguerò
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 19:49:33
ho verificato ancora e ho visto un'altro problema. Le virgolette vengono capoti tutti nel testo Source:
Originale: استرداد ثمن عینا “”” return of the actual consideration”
Processato con macro: استرداد ثمن عینا “”” ” return of the actual consideration
La direzione giusta sarebbe quella di RTL. Sì, la lingua è persiana che usa caratteri arabi (con un po di differenza) per scrivere.
grazie e buona serata
di Vecchio Frac data: 13/07/2017 22:38:16
Ecco una nuova versione del codice, credo di aver eliminato la maggior parte dei problemi che avevamo.
Ho anche capito adesso come fare, se saltano fuori altri caratteri strani da considerare :)
Dai un'occhiata.
Option Explicit
Sub separate_text()
Dim i As Long
Dim latin As String
Dim arabic As String
Dim last As String
Dim char As String
Dim bquote As Boolean
Dim cel As Range
Range("C2:D1000").Clear
For Each cel In Range("A2:A100")
If Trim(cel) = "" Then Exit For
arabic = ""
latin = ""
bquote = False
last = ""
For i = 1 To Len(cel)
char = Mid(cel, i, 1)
If bquote Then
If last = "latin" Then latin = latin & char Else arabic = arabic & char
End If
If AscW(char) < 65 Then
If Not bquote Then
If last = "latin" Then latin = latin & char Else arabic = arabic & char
End If
If AscW(char) = 34 Then
bquote = Not bquote
End If
End If
If AscW(char) > 64 And AscW(char) <= 255 Then
If Not bquote Then
latin = latin & char
last = "latin"
End If
End If
If AscW(char) > 255 Then
If AscW(char) = 8217 Or AscW(char) = 8211 Or AscW(char) = 8220 Or AscW(char) = 8221 Then
latin = latin & char
Else
If Not bquote Then
arabic = arabic & char
last = "arabic"
End If
End If
End If
Next
latin = Trim(latin)
arabic = Trim(arabic)
cel.Offset(, 2) = Trim(arabic)
cel.Offset(, 3) = Trim(latin)
Next
MsgBox "All done."
End Sub |
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 13/07/2017 23:28:32
ho controllato e adesso funziona quasi alla perfezione. C'è sempre problema con questi benedetti parentesi che su qualche riga funziona e su alcune no. ecco alcune: ho copiato da Excel, da sinistra: versione originale e a destra la versione processata:
Mi domandavo: forse succede così perché le partentesi in due lingue usano codici diversi, e succede cosi perhè l'autore ha messo le parentesi per la parte scritta in inglese, mentre la sua tastiera era sui caratteri arabi e quindi in realtà quella partentesi appartiene ai set di caratteri arabi e non a quelli latini? può essere questo il problema?
اجتماع و تبانی (association) gathering and collusion<---separatore->اجتماع و تبانی ( association) gathering and collusion
اجرای عین تعهد (specific performance (of an obligation<---separatore->اجرای عین تعهد ( specific performance (of an obligation
اشتباه،فراموشی،اکراه،جهل،عجز،اضطرار و ….)(a tradition narrated from prophet) (p.u) there are nine instances that my followers are not accountable for,mistake,forgetfulness,duress,ignorance,weakness,necessity and…<---separatore->اشتباه،فراموشی،اکراه،جهل،عجز،اضطرار و ….)(… a tradition narrated from prophet) (p.u) there are nine instances that my followers are not accountable for,mistake,forgetfulness,duress,ignorance,weakness,necessity and
grazie ancora
di Vecchio Frac data: 14/07/2017 10:25:19
cit. "Mi domandavo: forse succede così perché le partentesi in due lingue usano codici diversi"
---> Può essere! Devo fare un confronto analizzando i codici del carattere appena si verifica la condizione (uno è ASCII, l'altro è Unicode).
Negli ultimi esempi che hai fatto nel post di ieri sera, nell'originale ci sono parentesi che vengono processate esattamente come mostrate.
Mi mostri per favore il risultato atteso?
e.g:
originale: اجتماع و تبانی (association) gathering and collusion
processato: اجتماع و تبانی (association) gathering and collusion
atteso: ??
originale: اجرای عین تعهد (specific performance (of an obligation
processato: اجرای عین تعهد (specific performance (of an obligation
atteso: ??
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 14/07/2017 10:55:12
mi sembra che macro funziona correttamente e il problema deriva dal testo originale. Perchè il secondo esempio che mi hai mandato nella visualizzazione LTR, le parentesi non si vedono correttamente, infatti macro lo genera com'è. Ma se visualizziamo il testo in modalità RTL si vede correttamente. In questo caso la visualizzazione è corretta ma in verità la parentesi e la sua posizione è sbagliata. ti mando un screenshoot di visualizzazione RTL. A questo punto penso che abbiamo risolto e il problema non deriva da macro ma da errori nel testo originale. Sei anche tu della mia stessa idea?
originale: اجتماع و تبانی (association) gathering and collusion
processato: اجتماع و تبانی (association) gathering and collusion
atteso (processato correttamente): اجتماع و تبانی (association) gathering and collusion
originale: اجرای عین تعهد (specific performance (of an obligation
processato: اجرای عین تعهد (specific performance (of an obligation
atteso: اجرای عین تعهد specific performance (of an obligation)
di Vecchio Frac data: 14/07/2017 11:22:39
Appena copio e incollo la frase:
اجرای عین تعهد (specific performance (of an obligation
nel mio file di Excel formato righ-to-left, il risultato è ancora diverso dal tuo perchè le parentesi sono mostrate correttamente : اجرای عین تعهد specific performance (of an obligation). La prima parentesi (partendo da sinistra, subito dopo l'ultima alef e prima di "specific") è vista come carattere arabico dal copia incolla!
La macro restituisce quindi un risultato sbagliato perchè accoda la parentesi finale al testo persiano:
اجرای عین تعهد (
Il problema qui è che viene interpretata correttamente come parentesi aperta (la legge da destra a sinistra infatti) ma non la assegna al testo inglese perchè l'ultimo carattere letto è di tipo arabico.
Nota che questo stesso problema si verificherà sempre se subito dopo il testo persiano c'è una parentesi e un testo inglese. In pratica la parentesi aperta subito dopo il testo persiano viene assegnata a questo testo e non al testo successivo (forse posso risolvere).
Non è quindi un errore del testo ma della macro :)
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 14/07/2017 11:47:52
grazie, va benissimo. allora rimango in attesa delle tue notizie.
Avrei anche un'altra richiesta riguarda Excel. Praticamente vorrei eliminare all'interno del testi i testi che si trovano all'interno della parentesi, parentesi compreso. Apro una nuova discussione per questo?
Grazie ancora
di Vecchio Frac data: 14/07/2017 11:58:58
cit. "rimango in attesa delle tue notizie. "
---> Spero di non deluderti. Ho fatto delle prove ma è una cosa complicata e non so se risolvo.
cit. "vorrei eliminare all'interno del testi i testi che si trovano all'interno della parentesi, parentesi compreso"
---> Con una regex credo si possa fare senza troppi problemi.
Se questo è collegato a tutta questa discussione allora possiamo continuare qui.
Ma se togli il testo tra parentesi dal testo che stiamo analizzando, allora non si pone più alcun problema riguardo al grosso problema rimasto (se cioè al testo persiano segue una parola inglese racchiusa tra parentesi, la macro fallisce).
Se è invece una cosa nuova e diversa allora sì, apri una nuova discussione.
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 14/07/2017 12:12:30
no, il discorso delle parentesi riguarda un'altro testo quindi ho aperto una nuova discussione.
grazie mille
di Vecchio Frac data: 14/07/2017 15:28:55
Ho provato in modi diversi, ma non riesco a risolvere.
La parentesi aperta dopo il testo persiano e che si riferisce a testo inglese non viene gestita correttamente perchè viene attribuita al testo persiano.
Non so se questo è l'unico caso problematico.
Separare testi con caratteri arabi
di Far (utente non iscritto) data: 14/07/2017 15:37:20
va benissimo, non è un grosso problema. Forse solo 2% del testo ha le parentesi che si può anche fare manualmente.
Grazie mille della disponibilità
Vuoi Approfondire?