Strona 1 z 1
[SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: śr lis 23, 2022 7:27 pm
autor: Ania
Witam,
dostałam arkusz który ma w kolumnie wpisany tekst typu :'100g' lub na przykład '36kg'. Jak go podzielić na wiersze zawierające '100' i 'g' i odpowiednio '36' i 'kg'? Wydaję się że to prosta rzecz i oczywista, a walczę z tym już tyle czasu i nic mądrego nie wymyśliłam. Jestem dość słaba z używania jakiś funkcji
chodzi mi o to żeby liczy oddzielić od liter, ale niestety nie są one w ogóle niczym nie rozdzielone
Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst
: śr lis 23, 2022 9:38 pm
autor: Jermor
Podsyłam ci rozwiązanie, przy założeniu, że to apostrofy są ogranicznikami tekstu.
Można dla wyodrębnienia liczb i liter utworzyć po jednej formule. Jednak abyś zrozumiała sposób działania, przesyłam ci rozwiązanie z rozłożeniem na logicznie potrzebne działania.
Ostatnią czynnością, jaką trzeba wykonać to zamienić otrzymane wyniki w zwykłe wpisy. To zrealizujesz kopiując wyniki (CTRL+C), a następnie wklejając specjalnie (SHIFT+CTRL+V) jako ciągi znaków i liczby.
Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst
: czw lis 24, 2022 8:39 am
autor: Ania
Bardzo dziękuję za szybką pomoc i dokładne wytłumaczenie kroków
A jakbym miała takie dane w wierszu: mleko w proszku 100ml. To da się przy pomocy danych funkcji rozdzielić do jednej kolumny nazwę produktu, do drugiej liczbę, a do trzeciej jednostkę typu ml, kg itp. Zgadza się?
Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst
: czw lis 24, 2022 6:11 pm
autor: pit
Wypróbuj Dane -> Tekst jako kolumny.
Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst
: czw lis 24, 2022 7:13 pm
autor: Jermor
Da się. Jednak trzeba zdawać sobie sprawę z możliwości błędnego zinterpretowania danych ze źródła. Założenie jest powiem takie, że źródło składa się z tekstu określającego nazwę, następującej po nim liczby mówiącej o ilości i miana tej liczby.
Przy tak rozumianym zagadnieniu należy wyznaczyć: położenie pierwszej cyfry, położenie pierwszej litery znajdującej się po liczbie oraz długość całego tekstu
Zakładając, że D to długość całego tekstu, PC położenie pierwszej cyfry w tym tekście a DL położenie pierwszej litery za cyframi, formuły powinny mieć taką postać:
- =LEWY("tekst";PC-1) formuła wyodrębni tekst przed pierwszą cyfrą (nazwa).
- =MID("tekst";PC;D-DL+1) formuła wyodrębni fragment od pierwszej cyfry do wystąpienia pierwszej litery po cyfrach (liczba).
- =PRAWY("tekst";D-DL+1) formuła wyodrębni końcowy tekst po ostatniej cyfrze (miano).
Do wyznaczenia położenia PC i DL należy wykorzystać takie formuły:
- PC =SZUKAJ.TEKST("[:digit:]";"tekst") formuła poda położenie pierwszej napotkanej cyfry w ciągu znaków
- DL =SZUKAJ.TEKST("[:alpha:]";"tekst";PC) formuła poda położenie pierwszej litery występującej po cyfrach.
zapis "tekst" odnosi się do komórki zawierającej tekst.
Błędne działanie wystąpi, gdy nazwa towaru będzie zawierała choćby jedną cyfrę, np. Bebiko2, Witamina D3 2000jm.
Skorzystanie z rady @pit nie jest efektywne. Należy wskazać znak, jaki oddziela od siebie poszczególne części źródła. Tu takiego znaku nie ma.
Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst
: czw lis 24, 2022 8:41 pm
autor: Ania
Bardzo dziękuję Jermor za pomoc i obszerne wyjaśnienia. Podziwiam twoją wiedzę na temat programu i formuł. Bez ciebie każdy wiersz po kolei bym musiała dzielić przez kopiowanie i wycinanie fragmentów, a jest ich kilka tysięcy
dzięki tobie zaoszczędziłam dużo czasu i przekonania że marnuje czas. Na szczęście wszystkie nazwy produktów zawierają tylko literki, a nie cyfry. Twoje rozwiązanie jest idealne dla mnie.
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: czw lis 24, 2022 10:34 pm
autor: Jan_J
Propozycja @Jermor-a rozwiązuje problem przez zastosowanie formuł wyłuskujących poszczególne części składowe z tekstu. Innym nadającym się do zastosowania narzędziem są wyrażenia regularne.
Staramy się przekształcić każdy wpis postaci
<ciąg liter i spacji><spacja><ciąg cyfr><opcjonalna spacja><ciąg liter>
tak by rozdzielić go w jednoznaczny sposób (np. wstawiając średniki albo tabulatory) bezpośrednio przed i po ciągu cyfr, i gubiąc przy okazji stojące wokół niego spacje (if any).
W Calc:
znajdź
([a-z ]+) ([0-9]+) ?([a-z]+)
zamień na (przy włączonej obsłudze wyrażeń regularnych)
$1\t$2\t$3
W edytorach tekstu nie związanych z Libre ani OpenOffice (np. Notepad++, świetny edytor do transformowania surowego tekstu):
znajdź
([a-z ]+) ([0-9]+) ?([a-z]+)
zamień na (przy włączonej obsłudze wyrażeń regularnych)
\1\t\2\t\3
Zalety:
* większa podatność na modyfikacje wzorców (mniej do zrobienia jeśli zmieni się zestaw wymagań)
* nieuwiązanie do narzędzia programowego (możesz wykorzystać nawet notatnikopodobny edytor, byle dostatecznie silny)
* operacja nie pozostawia śmieci w postaci pierwotnego tekstu
Wady (?):
* w Calcu nastapi zamiana zawartości komórek, ale wynik trzeba będzie podzielić na przylegające kolumny, np. operacją Tekst jako kolumny (ze wskazaniem separatora) albo Kopiuj / Wklej specjalnie / Jako niesformatowny tekst (jak poprzednio).
* tekst z edytora też trzeba wkleić specjanie w obszar arkusza
* ponowne użycie wymaga ponownego wywołania formularza F&R
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: czw lis 24, 2022 11:43 pm
autor: Jermor
Propozycja @Jan_J jest zdecydowanie najlepsza. Jak się przeczyta, że to problem w Calcu, to od razu fiksuje się na formuły. A przecież są procedury taka jak ta opisana powyżej. Inna sprawa, że znajomość i umiejętność posługiwania się wyrażeniami regularnymi nie jest powszechna.
Zaletą propozycji @Jan_J jest dodatkowo to, że nie trzeba kopiować formuł do tysięcy wierszy (o tylu wspomniała @Ania), a podział na kolumny, już bezproblemowo, zrealizuje wspomniany przez @pit-a "Tekst jako kolumny".
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 10:23 am
autor: Jermor
Dopisuję jednak pewne wyjaśnienie. Zaproponowana metod jest świetna, ale w przypadku OpenOffice można nadziać się na rafy związane z literami charakterystycznymi dla języka polskiego.
Podany przez @Jan_J wzorzec ([a-z ]+) ([0-9]+) ?([a-z]+) nie zinterpretuje prawidłowo niektórych konstrukcji.
Przykład zupełnie bezsensowny, zapis "śćń łóę 20 szt" nie zostanie zinterpretowane jako pasujący do wzorca, mimo że spełnia warunki ciągu tekstowego.
Bardziej sensownie, to np. zapis "Łódź 1 szt." także nie zostanie rozpoznany.
Dlatego zamiast wyrażenia "[a-z]" bezpieczniej jest wprowadzić klasę [:alpha:], gdyż obejmuje ona wszystkie litery.
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 2:07 pm
autor: cwolan
Jermor pisze: ↑pt lis 25, 2022 10:23 am
Dopisuję jednak pewne wyjaśnienie. Zaproponowana metod jest świetna, ale w przypadku OpenOffice można nadziać się na rafy związane z literami charakterystycznymi dla języka polskiego. [...]
Czy tylko w przypadku OpenOffice? LibreOffice oszczędza możliwości "nadziania się na rafy"?
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 2:19 pm
autor: Jan_J
Nie. Uproszczenie sytuacji, jakie przyjąłem w odpowiedzi, wynikło z pewnej rutyny postępowania.
„Rafa” ma charakter ogólny i wynika stąd, że [a-z] określa zakres znaków będący blokiem numeracji Unikodu.
Być może są „egzotyczne” systemy, w których [a-z] oznacza „literę bieżącego alfabetu” albo „literę jakiegokolwiek alfabetu”, ale oby było ich jak najmniej.
Druga „rafa” może się wiązać z rozróżnianiem albo nierozróżnianiem wielkich i małych liter przy dopasowywaniu. W różnych systemach korzystających z regex bywa różnie. W AOO/LO steruje tym osobne pole formularza.
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 2:19 pm
autor: Jermor
No nie. W LibreOffice jest taki sam problem. Napisałem OpenOffice chyba dlatego, że @Ania używa właśnie Apache OpenOffce.
A co może ważne, zapis "[a-ż]" obejmie już wszystkie litery polskie. Ma to związek, jak sądzę, z tym że te graniczne litery wyznaczają przedział kodów, jaki będzie uwzględniany. Pisałem o tym w wątku omawiającym funkcję REGEX() (Podręczniki i przewodniki).
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 2:26 pm
autor: Jan_J
Jermor pisze: ↑pt lis 25, 2022 2:19 pm
A co może ważne, zapis "[a-ż]" obejmie już wszystkie litery polskie. Ma to związek, jak sądzę, z tym że te graniczne litery wyznaczają przedział kodów, jaki będzie uwzględniany.
Byłbym ostrożny. W Unikodzie ord('a') = 97, ord('z') = 122, ale ord('ż') = 380. Rozumienie [a-ż] jako „kompletu polskich liter” — o ile w ogóle gdzieś działa — wiąże się z właściwością LC_COLLATE ustawień językowych, określającą kolejność znaków w alfabecie. Zależy więc od ustawień językowych użytkownika. Zachodzi więc ryzyko — w środowiskach nie respektujących tych ustawień albo przy ustawieniu niezgodnym z intencją — nieoczekiwanych efektów działania. Użycie [:alpha:] jest bezpieczniejsze.
Załączam jako test wyniki zamiany s/[a-ż]/_/ wykonanej we Writerze ustawionym na język polski z wyłączonym rozróżnianiem wielkości liter. Widać, że efekt nie do końca zadowala (mniejsza o litery islandzkie, ale „ł”?). Zaś uniksowy sed odmówił przeprowadzenia operacji twierdząc, że „ż” nie jest poprawnym opisem końca zakresu, mimo że pojedyncze „ż” jako znak przyjmuje.
Kod: Zaznacz cały
nr przed po
56 8 8
57 9 9
58 : :
59 ; ;
60 < <
61 = =
62 > >
63 ? ?
64 @ @
65 A _
66 B _
67 C _
68 D _
69 E _
70 F _
71 G _
72 H _
73 I _
74 J _
75 K _
76 L _
77 M _
78 N _
79 O _
80 P _
81 Q _
82 R _
83 S _
84 T _
85 U _
86 V _
87 W _
88 X _
89 Y _
90 Z _
91 [ [
92 \ \
93 ] ]
94 ^ ^
95 _ _
96 ` `
97 a _
98 b _
99 c _
100 d _
101 e _
102 f _
103 g _
104 h _
105 i _
106 j _
107 k _
108 l _
109 m _
110 n _
111 o _
112 p _
113 q _
114 r _
115 s _
116 t _
117 u _
118 v _
119 w _
120 x _
121 y _
122 z _
123 { {
124 | |
125 } }
126 ~ ~
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161 ¡ ¡
162 ¢ ¢
163 £ £
164 ¤ ¤
165 ¥ ¥
166 ¦ ¦
167 § §
168 ¨ ¨
169 © ©
170 ª ª
171 « «
172 ¬ ¬
173
174 ® ®
175 ¯ ¯
176 ° °
177 ± ±
178 ² ²
179 ³ ³
180 ´ ´
181 µ µ
182 ¶ ¶
183 · ·
184 ¸ ¸
185 ¹ ¹
186 º º
187 » »
188 ¼ ¼
189 ½ ½
190 ¾ ¾
191 ¿ ¿
192 À _
193 Á _
194 Â _
195 Ã _
196 Ä _
197 Å _
198 Æ Æ
199 Ç _
200 È _
201 É _
202 Ê _
203 Ë _
204 Ì _
205 Í _
206 Î _
207 Ï _
208 Ð Ð
209 Ñ _
210 Ò _
211 Ó _
212 Ô _
213 Õ _
214 Ö _
215 × ×
216 Ø Ø
217 Ù _
218 Ú _
219 Û _
220 Ü _
221 Ý _
222 Þ Þ
223 ß ß
224 à _
225 á _
226 â _
227 ã _
228 ä _
229 å _
230 æ æ
231 ç _
232 è _
233 é _
234 ê _
235 ë _
236 ì _
237 í _
238 î _
239 ï _
240 ð ð
241 ñ _
242 ò _
243 ó _
244 ô _
245 õ _
246 ö _
247 ÷ ÷
248 ø ø
249 ù _
250 ú _
251 û _
252 ü _
253 ý _
254 þ þ
255 ÿ _
256 Ā _
257 ā _
258 Ă _
259 ă _
260 Ą _
261 ą _
262 Ć _
263 ć _
264 Ĉ _
265 ĉ _
266 Ċ _
267 ċ _
268 Č _
269 č _
270 Ď _
271 ď _
272 Đ Đ
273 đ đ
274 Ē _
275 ē _
276 Ĕ _
277 ĕ _
278 Ė _
279 ė _
280 Ę _
281 ę _
282 Ě _
283 ě _
284 Ĝ _
285 ĝ _
286 Ğ _
287 ğ _
288 Ġ _
289 ġ _
290 Ģ _
291 ģ _
292 Ĥ _
293 ĥ _
294 Ħ Ħ
295 ħ ħ
296 Ĩ _
297 ĩ _
298 Ī _
299 ī _
300 Ĭ _
301 ĭ _
302 Į _
303 į _
304 İ _
305 ı ı
306 IJ IJ
307 ij ij
308 Ĵ _
309 ĵ _
310 Ķ _
311 ķ _
312 ĸ ĸ
313 Ĺ _
314 ĺ _
315 Ļ _
316 ļ _
317 Ľ _
318 ľ _
319 Ŀ Ŀ
320 ŀ ŀ
321 Ł Ł
322 ł ł
323 Ń _
324 ń _
325 Ņ _
326 ņ _
327 Ň _
328 ň _
329 ʼn ʼn
330 Ŋ Ŋ
331 ŋ ŋ
332 Ō _
333 ō _
334 Ŏ _
335 ŏ _
336 Ő _
337 ő _
338 Œ Œ
339 œ œ
340 Ŕ _
341 ŕ _
342 Ŗ _
343 ŗ _
344 Ř _
345 ř _
346 Ś _
347 ś _
348 Ŝ _
349 ŝ _
350 Ş _
351 ş _
352 Š _
353 š _
354 Ţ _
355 ţ _
356 Ť _
357 ť _
358 Ŧ Ŧ
359 ŧ ŧ
360 Ũ _
361 ũ _
362 Ū _
363 ū _
364 Ŭ _
365 ŭ _
366 Ů _
367 ů _
368 Ű _
369 ű _
370 Ų _
371 ų _
372 Ŵ _
373 ŵ _
374 Ŷ _
375 ŷ _
376 Ÿ _
377 Ź _
378 ź _
379 Ż _
380 ż _
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 2:56 pm
autor: cwolan
Jermor pisze: ↑pt lis 25, 2022 2:19 pm
A co może ważne, zapis "[a-ż]" obejmie już wszystkie litery polskie. Ma to związek, jak sądzę, z tym że te graniczne litery wyznaczają przedział kodów, jaki będzie uwzględniany. Pisałem o tym w wątku omawiającym funkcję REGEX() (Podręczniki i przewodniki).
We wspomnianym wyżej wątku jest:
Odrębnym problemem są litery charakterystyczne dla naszego języka. Są one prawidłowo rozpoznawane, jednak w wyrażeniach regularnych zawierających konstrukcję [a-z] nie będą rozpoznane, gdyż ich kody polskich liter znajdują się poza zakresem liter od "a" do "z". Zapis [a-ż] uwzględni wszystkie polskie litery. Analogicznie - [A-Ż]. Gdy jednak chcemy uwzględnić wszystkie litery polskiego alfabetu w ograniczonym zakresie liter, np. od "a" do "d" musimy to zapisać tak: [a-dąć].
Ciekawostka: Na pytanie, jaka jest druga litera alfabetu, najczęstszą odpowiedzią jest "b" a nie "ą".
(Jeśli wolno spytać, ile procent przypada na odpowiedź "l"?)
Podzielam ostrożność kolegi
Jan_J.
Help LibreOffice odsyła do
ICU Regular Expressions, gdzie można znaleźć pewne informacje.
---------------------------------
- ICU - Regular Expression.jpg (85.77 KiB) Przejrzano 2601 razy
Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst
: pt lis 25, 2022 3:03 pm
autor: Jan_J
Ach te zrzuty ekranu. Niekomentowalne...
Code points i porządek związany z LC_COLLATE nie są na ogół zgodne. Tym bardziej ostrożność.
Ale opis
The examples match ASCII letters and digits.
dotyczy tylko przykładu po lewej, co nie wyklucza innych możliwości użycia.