Имя: Пароль:
IT
Админ
Удаление поля CSV файлов
0 ivanovpetr79
 
24.02.23
23:18
Нужен простой и быстрый способ удаления первого поля во всех CSV файлах заданного каталога.

Поле должно удаляться для всех записей.
Разделить полей точка с запятой ;

Зы. Более общая задача: удалить поле с заданным индексом. Остальные условия те же.

Windows 10.
1 RomanYS
 
24.02.23
23:22
Если про 1С, то ЧтениеТекста и ЗаписьТекста. Реально быстро, насколько просто зависит от нюансов форматирования (кавычки и т.д.)
2 ivanovpetr79
 
24.02.23
23:24
Это секция Админ.

К 1С это не имеет никакого отношения.

Зы. Это школьная задачка по информатике. Там 1С не изучают.
3 bolder
 
24.02.23
23:26
(2) Без 1с делается в Excel.Удаляется колонка и сохраняется.
4 ivanovpetr79
 
24.02.23
23:29
Причём она имеет отношение больше к Devops и админству.

От программирования там всего лишь один цикл.

И он не на 1С.
5 Garykom
 
гуру
24.02.23
23:29
(0) >простой и быстрый способ удаления

это скопировать только нужные поля, нужных строк в новый файл
6 bolder
 
24.02.23
23:30
(3) Для всех файлов каталога нужно писать на VBA например,не уверен что школьники это знают.
7 ivanovpetr79
 
24.02.23
23:31
(3) А если в каталоге сотня тысяч файлов?

Классно ты автоматизируешь процессы на предприятии!
8 Garykom
 
гуру
24.02.23
23:33
рекомендую использовать очень популярный в DevOps Golang
https://zetcode.com/golang/csv/
9 bolder
 
24.02.23
23:34
(7) См (6),Гугл-автоматизатор.
10 bolder
 
24.02.23
23:36
(8) И как это соотносится с (2),школьной задачей?
11 ivanovpetr79
 
24.02.23
23:36
(6) в твоём решении есть зависимость от целого офисного пакета.

Причём платного.

В правильном решении есть зависимость ровно от одного EXE файла размером 24 килобайт.
12 Garykom
 
гуру
24.02.23
23:44
если свежая винда то никаких дополнительных exe не надо
https://devblogs.microsoft.com/scripting/easily-remove-columns-from-a-csv-file-by-using-powershell/
13 ivanovpetr79
 
24.02.23
23:44
(10) в школе готовят будущих админов. Нет?
14 bolder
 
24.02.23
23:46
(11) Ну ладно, тогда с помощью бесплатного VS community пишем короткий код на С++ .Ну Точно не для школьника.
15 Garykom
 
гуру
24.02.23
23:46
(14) На ЕГЭ по информатике на выбор даётся пять языков программирования:

Pascal;
Python;
Java;
C++;
C#.
16 ivanovpetr79
 
24.02.23
23:47
(12) близко, но опять неверно

Наслаждаемся верным решением:

https://telegra.ph/Udalenie-pervogo-polya-iz-CSV-fajla-02-24
17 Garykom
 
гуру
24.02.23
23:51
(16) это неверное решение
ибо оно кривое и нерабочее

почитай для начала про формат https://ru.wikipedia.org/wiki/CSV
"Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками ("). Если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд."

для учебной задачки школьного уровня с простейшим cvs (не учитываем кодировки и служебные символы с экранированием их) может и пойдет
для реальных CVS нет!
18 RomanYS
 
24.02.23
23:52
(16) что-то не видно учета нюансов форматирования
вот такой csv обработает неправильно:

"""Вывы , ывывы»",sdsd ;sdsds
19 Garykom
 
гуру
24.02.23
23:53
например подобный CVS:

"хрен ты вот это; правильно разделишь да это все колонка 1, хотя тут ;;;;; дохрена ;";колонка2;колонка3;колонка4
20 Garykom
 
гуру
24.02.23
23:53
(17) (19) *CSV
21 RomanYS
 
24.02.23
23:54
(16) ну вообще сомнительно выглядит выдавать за самое правильное подобное "Это свободно распространяемая утилита, которую можно скачать и установить на ваш компьютер."
22 ivanovpetr79
 
24.02.23
23:55
(17) я сегодня проверял. Оно работает.

А ваше - нет.
Кроме того, оно работает с msed
23 Garykom
 
гуру
24.02.23
23:56
(21) очень часто эту утилиту хрен поставишь на комп с виндой
где права зарезаны или проц не той системы (он в курсе про архитектуру IA64 где вполне себе Windows работала)
да еще и в пути надо прописать вручную
24 ivanovpetr79
 
24.02.23
23:56
(21) а в чем проблема?
25 Garykom
 
гуру
24.02.23
23:57
(22) извини но ты вероятно нифига не понял из (17)(18)(19)
26 Garykom
 
гуру
24.02.23
23:57
(24) в том что идиотское решение пытаешься выдать за правильное
27 ivanovpetr79
 
24.02.23
23:58
(23) это общее решение. Там можно скачать Zip архив.

Вы в айти сколько лет? Знаете про способы распространения Opensource ПО?
28 Garykom
 
гуру
24.02.23
23:59
Если рассматривать школьную информатику и комп на Windows
То правильный ответ будет:
1. Используем PowerShell
2. Пишем программу для обработки на Pascal, Python, Java, C++ или C#
29 Garykom
 
гуру
25.02.23
00:02
(27) я в IT почти 30 лет
неважно что опенсурс если готовых бинарников нет, и сам хрен соберешь под https://ru.wikipedia.org/wiki/Intel_Architecture или https://ru.wikipedia.org/wiki/ARM_(архитектура)
и да под обе есть Windows!
30 ivanovpetr79
 
25.02.23
00:02
(17) тебя в школе учили принципам KISS?

Не переусложняй, простейшее рабочее решение - самое верное.
31 ivanovpetr79
 
25.02.23
00:03
(28) зачем писать программу, если есть готовая?
32 Garykom
 
гуру
25.02.23
00:03
(30) так у тебя не простейшее (ибо хрен поставишь) и не рабочее (почитай сам про CSV)
33 Garykom
 
гуру
25.02.23
00:04
(31) а чем "линукс вей" скрипт отличается от написания программы?
открой уже ссылку (12)
34 ivanovpetr79
 
25.02.23
00:05
(29) ты внимательно читал текст решения? Там же прямо написано где качать, вплоть до названия секции на странице скачивания.
35 Garykom
 
гуру
25.02.23
00:07
(34) ты придуриваешься?
где мне скачать sed под Windows ARM ?
36 ivanovpetr79
 
25.02.23
00:08
(35) а где в условиях задачи сказано, что это будет ARM?

Почему ты пытаешься переусложнять?
37 Garykom
 
гуру
25.02.23
00:10
(36) ты понимаешь что изображаешь барана хотя тебя несколько раз тыкнули что твое решение кривое?
ну не поймет оно когда CSV нормальный, с ";" в полях
38 ivanovpetr79
 
25.02.23
00:11
(35) человек, тебе дали инструкцию.

Ты должен ей следовать. А потом уже сообщить о проблемах.

Почему ты сообщаешь о несуществующих проблемах решения, даже не попробовав его?
39 Garykom
 
гуру
25.02.23
00:11
ыыыы
40 ivanovpetr79
 
25.02.23
00:12
(37) я сегодня пробовал это решение. Оно работает.

По буквам: Работает.
41 Garykom
 
гуру
25.02.23
00:14
(40) оно не работает кроме редких случаев простейших CSV

Ваня;Петя;79 // разделит
";Вася;";"Пе;тя";79 // не разделит правильно!
42 ivanovpetr79
 
25.02.23
00:17
(41) первое правило любого инженера: не переусложняй
43 Garykom
 
гуру
25.02.23
00:18
(42) ты не инженер
ты тупой дятел
44 ivanovpetr79
 
25.02.23
00:19
(12)

Общее правило состоит в том, что sed работает быстрее, чем Import-Csv, потому что sed является утилитой командной строки, которая работает непосредственно с текстом, в то время как Import-Csv - это модуль PowerShell, который предоставляет объекты для работы с CSV файлами, что требует больше ресурсов.
45 ivanovpetr79
 
25.02.23
00:21
(43) пройди наконец курс по бережливой разработке (lean development)
46 Garykom
 
гуру
25.02.23
00:23
(44) обрати внимание что там в твоей ссылке для перебора файлов используется зачем то PowerShell
"Get-ChildItem для получения списка всех CSV файлов в указанном каталоге. Затем, с помощью конвейера ForEach-Object"

хотя можно прекрасно обойтись возможностями bat/cmd
47 Garykom
 
гуру
25.02.23
00:24
(45) это не леан
это ХХП (уяк-уяк-продакшен)
48 RomanYS
 
25.02.23
00:37
Кого-то ТС напоминает, не пойму только Гения или Маньяка))
49 ivanovpetr79
 
25.02.23
08:36
(46) который устарел в 2006м году

Зачем в 2023м году использовать технологию 1981го года?

(47) это вспомогательная задача. Здесь нет понятия продакшена.
50 ivanovpetr79
 
25.02.23
08:52
echo off
setlocal enabledelayedexpansion

set "path=путь_к_каталогу"

for %%F in (%path%\*.csv) do (
    set "filename=%%~nF"
    set "directory=%%~dpF"
    set "output=!directory!!filename!_modified.csv"
    type "%%F" | sed "s/^[^;]*;//" > "!output!"
)


Если рассматривать только представленные решения, то скорее всего, PowerShell будет работать быстрее, чем Batch. Это связано с тем, что в PowerShell используется объектная модель, что может быть более эффективным, чем обработка текстовых файлов с помощью командной строки. Кроме того, PowerShell предлагает мощный синтаксис, который может облегчить написание сложных скриптов, тогда как в Batch не так много инструментов для обработки строк и файлов.
51 Злопчинский
 
25.02.23
09:46
(43) "если бы строители строили так как программисты пишут программы - первый же залетевший дятел разрушил цивилизацию"...
52 ivanovpetr79
 
25.02.23
10:33
(51) во-первых  идёт речь не о строительстве дома.

А о элементарной тестовой фикстуре для интеграции.

Во-вторых это задача не связанная с программированием.
53 Кирпич
 
25.02.23
11:28

import os
import csv

path_in = r"C:\temp\csv"
path_out = r"C:\temp\csv\out"

my_dialect = csv.excel
my_dialect.delimiter = ","
my_dialect.quoting=csv.QUOTE_NONNUMERIC
my_dialect.skipinitialspace = True

for f in os.listdir(path_in):
    if f.endswith(".csv"):
        with open(os.path.join(path_in, f)) as file_in:
            with open(os.path.join(path_out, f),"w") as file_out:
                reader = csv.reader(file_in, lineterminator='\r', dialect = my_dialect)
                writer = csv.writer(file_out, lineterminator='\r', dialect = my_dialect)
                for row in reader:
                    writer.writerow(row[1:])
54 Кирпич
 
25.02.23
11:29
(0) учи питон. тяп ляп и готово. и на форумах не надо ничего спрашивать
55 RomanYS
 
25.02.23
11:41
(53) Это ты прямо задачу описанную в (0) решил, для ТСа это избыточно, ему надо до первого разделителя строки порезать. Без этого не будет последующего секаса с кривыми полученными csv)))
56 Кирпич
 
25.02.23
11:50
(55) Ну автор пускай занимается тем, что ему нравится :) Он же инженер. А нам, неинженерам, лучше попроще и понадежнее.
57 ivanovpetr79
 
25.02.23
12:10
(56) это админо девоповская задача для qs
58 Кирпич
 
25.02.23
12:36
(57) ну вот девопсу и сам бог велел на питоне скрипты царапать
59 mistеr
 
25.02.23
12:51
(16) sed отлично, но я бы взял awk, его проще сопровождать. Есть форки awk, разбирающие CCSV по всем правилам.
60 ivanovpetr79
 
25.02.23
13:06
(59) действительно, в целом, использование awk может быть более эффективным и гибким решением для обработки файлов и текстовых данных, особенно если нужно обрабатывать большие объемы данных или выполнять сложные операции. Однако, если задача очень простая, то использование MiniSed может быть быстрее и удобнее.
61 ivanovpetr79
 
25.02.23
13:07
Windows awk CSV Processing.


Petr Boldin
Перепишите это решение используя awk для Windows. PowerShell тоже должен быть

Get-ChildItem -Path "путь_к_каталогу" -Filter *.csv | ForEach-Object {Get-Content $_.FullName | MiniSed "s/^[^;]*;//" | Set-Content ($_.DirectoryName + "\" + $_.Name)}

Для использования awk в Windows необходимо установить GNU awk. Вот как будет выглядеть переписанное решение с использованием awk и PowerShell:

Get-ChildItem -Path "путь_к_каталогу" -Filter .csv | ForEach-Object {
gawk -i inplace "{sub(/^[^;];/,"")}1" $.FullName
Move-Item $.FullName ($.DirectoryName + "" + $.Name)
}

Объяснение:

gawk - это имя исполняемого файла GNU awk, который мы должны использовать вместо MiniSed.
-i inplace - это опция, которая говорит gawk перезаписать файл вместо вывода результата в консоль. Это эквивалентно опции sed -i.
"{sub(/^[^;]*;/,\"\")}1" - это скрипт awk, который заменяет первый символ ; в строке на пустую строку. Это эквивалентно регулярному выражению s/^[^;]*;// в MiniSed.
Move-Item - это команда PowerShell, которая перемещает файл в другое место. Мы используем ее вместо Set-Content для перемещения файла после его изменения.
62 ivanovpetr79
 
25.02.23
13:08
Windows awk CSV Processing.


Petr Boldin
Перепишите это решение используя awk для Windows. PowerShell тоже должен быть

Get-ChildItem -Path "путь_к_каталогу" -Filter *.csv | ForEach-Object {Get-Content $_.FullName | MiniSed "s/^[^;]*;//" | Set-Content ($_.DirectoryName + "\" + $_.Name)}

Для использования awk в Windows необходимо установить GNU awk. Вот как будет выглядеть переписанное решение с использованием awk и PowerShell:

Get-ChildItem -Path "путь_к_каталогу" -Filter .csv | ForEach-Object {
gawk -i inplace "{sub(/^[^;];/,"")}1" $.FullName
Move-Item $.FullName ($.DirectoryName + "" + $.Name)
}

Объяснение:

gawk - это имя исполняемого файла GNU awk, который мы должны использовать вместо MiniSed.
-i inplace - это опция, которая говорит gawk перезаписать файл вместо вывода результата в консоль. Это эквивалентно опции sed -i.
"{sub(/^[^;]*;/,\"\")}1" - это скрипт awk, который заменяет первый символ ; в строке на пустую строку. Это эквивалентно регулярному выражению s/^[^;]*;// в MiniSed.
Move-Item - это команда PowerShell, которая перемещает файл в другое место. Мы используем ее вместо Set-Content для перемещения файла после его изменения.



Petr Boldin
Чем решение с awk лучше решения с minised

Использование awk в данном случае имеет несколько преимуществ перед использованием MiniSed:

Поддержка широкого диапазона операционных систем: awk доступен как в Linux, так и в Windows, в то время как MiniSed может работать только в некоторых средах Windows, в которых он был установлен. Это означает, что решение с awk более переносимо.

Более мощный язык программирования: awk является полноценным языком программирования, который поддерживает условные операторы, циклы, функции и другие возможности, которых нет в MiniSed. Это делает awk более гибким инструментом для работы с файлами и обработки текста.

Удобство использования: awk позволяет легко обрабатывать файлы в пакетном режиме, используя конструкцию awk '{commands}' file1 file2 .... В отличие от этого, MiniSed требует запуска одной команды для каждого файла, что может быть неудобно, если нужно обрабатывать множество файлов.

Широкие возможности для обработки данных: awk поддерживает множество встроенных функций и операций для работы с данными, включая разделение на поля, суммирование и группировку. Это может быть очень полезно, если требуется выполнить более сложные операции с данными, которые не поддерживаются MiniSed
63 mistеr
 
25.02.23
13:32
(60) >если задача очень простая

Ты начал с очень простой задачи, а потом начал усложнять, пока не отпали все решения, кроме твоего :)
64 Кирпич
 
25.02.23
13:53
(62)Люди упираются, изобретают парсеры csv для awk https://github.com/geoffroy-aubry/awk-csv-parser/tree/stable/src, а вы бабах и одной регулярочкой всё порешали. Ай молодцы :)
65 ДедМорроз
 
25.02.23
16:57
Я чего-то упустил из виду - а когда comma separated файлы стали semicolon separated ?
66 RomanYS
 
25.02.23
17:16
(65) Либра предлагает на выбор, МС кажется из региональных настроек берёт
67 Garykom
 
гуру
25.02.23
17:29
(65) технически CSV очень близок к https://en.wikipedia.org/wiki/Delimiter-separated_values
точнее это наиболее известный вариант

лично мне больше нравится https://ru.wikipedia.org/wiki/TSV
68 H A D G E H O G s
 
25.02.23
19:42
(48) Это БД развлекается. Скучно, узкий круг общения в местной среде, а скорее всего вообще нет.
69 ivanovpetr79
 
05.03.23
15:11
(65) вот и выросло поколение, которое никогда не пользовалось Excel.

В CSV файлах (Comma Separated Values - значения, разделенные запятыми) в качестве разделителя колонок можно использовать не только запятую, но и другие символы, например, точку с запятой (;), табуляцию (Tab) или пробел. В разных регионах мира используются различные символы в качестве разделителя.

Однако использование точки с запятой (;) в качестве разделителя в CSV файлах обычно связано с тем, что в некоторых странах, таких как Германия, Швейцария, Австрия, Франция, Италия, Испания и другие, десятичный разделитель в числах является запятой, а не точкой, как это принято в США и Великобритании.

Таким образом, использование запятой в качестве разделителя колонок и точки в качестве десятичного разделителя может привести к путанице и ошибкам в интерпретации данных в различных приложениях и операционных системах. Поэтому в этих странах для разделения колонок в CSV файлах часто используется точка с запятой (;) в качестве разделителя колонок, чтобы избежать подобных проблем.
70 Garykom
 
гуру
05.03.23
22:46
(69) объясни уже как твое решение правильно разделит когда в строковых колонках есть символы ";" и "," ?
71 ivanovpetr79
 
05.03.23
23:07
(70) их нет. На нет и суда нет.

Зы. Вы в курсе про основные принципы lean разработки? KISS? Не переусложняй? Не ищи кошку там, где её нет.
72 Garykom
 
гуру
05.03.23
23:32
(71) Это не lean и не kiss
Это говнокодинг дятлами-недоучками
73 Garykom
 
гуру
05.03.23
23:33
И да я сам бывает говнокодю из-за сроков или даже незнания
Но не оправдываю свой говнокод мифическими lean/kiss и переделываю когда тыкают
74 АгентБезопасной Нацио
 
06.03.23
05:46
(69) глядя на вас, вспоминается фраза Жванецкого: "...но иногда возраст приходит один."©
75 ivanovpetr79
 
06.03.23
07:05
(72) м-да...

То есть в сейсмически не опасных территориях (там, где за последние 100..200 лет) не было ни одного землетрясения ты тоже предлагаешь строить устойчивые к землетрясениям дома "просто так", "на всякий случай", "а если вдруг", "посмотрите, что случилосьв Турции"?
76 АгентБезопасной Нацио
 
06.03.23
07:16
(75) экранированные символы-разделители в CSV-файлах - явление  чуть более, чем обычное. То, что вы с ним не встречались - говорит лишь о том, что вы живете в маленьком ограниченном мирке...
77 mikecool
 
06.03.23
08:52
(4) это хлкку?
78 АгентБезопасной Нацио
 
06.03.23
09:07
(77) а вариант, чо. Оно ж художнег, почему б ему и хокку не пейсать
79 KJlag
 
06.03.23
09:21
(75) экранированные разделители у меня в каждой второй csv-шке.
другое дело что самих выгрузок на csv сейчас не так много, больше в xml выгружаем, но все же менеджеры в описание товаров любят всякого понаписать
80 uno-group
 
06.03.23
13:07
Python в школах учат и написать на нем задачу из 0 не проблема. Ексель и скрипты к нему тоже учат написать на нем рабочее решение тоже можно.
утилиты командных строк которые еще надо откуда то качать в школах не учат. И не факт что на экзамене будет на компе доступ в интернет чтобы, что то с него скачать.
Прав на установку чего либо у школьников точно не будет. В каком классе в школе Devops учат напомните?
81 uno-group
 
06.03.23
13:10
Каталожные номера, артикулы, коды товаров очень часто идут в 1 поле и разделены чем попало в том числе и ";". Так что только посимвольное сравнение и подсчёт открывания и закрывания кавычек. нахождение ; вне кавычек.
82 uno-group
 
06.03.23
13:14
А еще в нем может быть символ переноса строки, внутри кавычек. Когда в поле храниться многострочный текст. Так, что мало найти правильные ";" нужно еще найти правильное начало строки. так что тупо выкинуть все до ";" мало дальше все равно придется эту строку посимвольно до конца прочитать.
83 Irbis
 
06.03.23
14:53
У мну при загрузке реестров на взыскание примерно как в (81) и (82) работает. Какие csv после преобразования из Excel приходят от приставов и/или других коллекторов хрен угадаешь. Приходится разбирать файл чуть ли не посимвольно.
84 Garykom
 
гуру
06.03.23
15:06
(83) разбор правильного CSV = Конечный Автомат
и понятно что КА работает посимвольно, меняя свое состояние
85 АгентБезопасной Нацио
 
06.03.23
16:41
(84) кстати, попадалась где-то жуткая регулярка для разбора. Но вроде и она до конца не работала...
86 Garykom
 
гуру
06.03.23
16:55
(85) И не будет регулярка работать
Это же синтаксический разбор с построением дерева как для скобок
87 АгентБезопасной Нацио
 
06.03.23
16:57
(86) теоретически регулярка - это как раз конечный автомат, который может это делать.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший