[SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Użytkowanie arkusza kalkulacyjnego
Ania
Posty: 3
Rejestracja: śr lis 23, 2022 7:21 pm

[SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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 :(
Ostatnio zmieniony czw lis 24, 2022 8:48 pm przez Ania, łącznie zmieniany 1 raz.
OpenOffice 4.1.13
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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.
Załączniki
ania_j.ods
(14.27 KiB) Pobrany 202 razy
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ania
Posty: 3
Rejestracja: śr lis 23, 2022 7:21 pm

Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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ę?
OpenOffice 4.1.13
pit
Posty: 22
Rejestracja: sob lis 12, 2022 4:13 pm

Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst

Post autor: pit »

Wypróbuj Dane -> Tekst jako kolumny.
LibreOffice 7.3.2.2 (x64) na Windows 11
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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ć:
  1. =LEWY("tekst";PC-1) formuła wyodrębni tekst przed pierwszą cyfrą (nazwa).
  2. =MID("tekst";PC;D-DL+1) formuła wyodrębni fragment od pierwszej cyfry do wystąpienia pierwszej litery po cyfrach (liczba).
  3. =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:
  1. PC =SZUKAJ.TEKST("[:digit:]";"tekst") formuła poda położenie pierwszej napotkanej cyfry w ciągu znaków
  2. 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.
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Ania
Posty: 3
Rejestracja: śr lis 23, 2022 7:21 pm

Re: Ratujcie: jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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.
OpenOffice 4.1.13
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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".
:super:
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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.
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
cwolan
Posty: 67
Rejestracja: pn sty 25, 2021 11:17 pm

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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"?
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 24.8
Windows 7,10,11 64-bit
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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).
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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	ż	_
	
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
cwolan
Posty: 67
Rejestracja: pn sty 25, 2021 11:17 pm

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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
ICU - Regular Expression.jpg (85.77 KiB) Przejrzano 2479 razy
OpenOffice 1.1.5 – 4.1.15
LibreOffice 3.3.0.4 – 24.8
Windows 7,10,11 64-bit
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] Jak z tekstu wyodrębnić liczbę i pozostały tekst

Post 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.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ