Манипулировать CSV-файлом: увеличить координаты ячейки / положение - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть CSV-файл с одной записью в каждой строке, три записи образуют целый набор данных.Итак, что мне нужно сделать сейчас, это поместить эти наборы в столбцы в один ряд.У меня есть трудности с описанием проблемы (таким образом, мой поиск не дал мне решения), так что вот пример.
Пример CSV-файла:

1  Joe  
2  Doe  
3  7/7/1990  
4  Jane  
5  Done  
6  6/6/2000  

В итоге я хочу вот что:

1  Name  Surname  Birthdate  
2  Joe   Doe      7/7/1990  
3  Jane  Done     6/6/2000  

Я пытаюсь найти решение, чтобы сделать это автоматически, так как мой фактический файл состоит из 480 наборов данных, каждый набор содержит 16 записей, и мне потребовалось бы несколько дней, чтобы сделать это вручную.

Мне удалось заполнить первую строку косвенной функцией Excel:

=INDIRECT("A"&COLUMN()-COLUMN($A1))

Поскольку COLUMN возвращает номер столбца, если я перетаскиваю первую строку в Excel, очевидно, это выглядит точно так же, какпервая строка:

1  Name  Surname  Birthdate  
2  Joe   Doe      7/7/1990  
3  Joe   Doe      7/7/1990  

Теперь я ищу способ увеличить позицию ячейки на единицу:

   A           B      C       D
1 Joe        =A1   =B1+1   =C1+1
2 Doe        =D1+1
3 7/7/1990
4 Jane  

Что должно привести к:

   A           B    C     D  
1 Joe        =A1   =A2   =A3  
2 Doe        =A4   =A5   =A4  
3 7/7/1990  
4 Jane  

Как видно из приведенного примера, координаты ячейки для A увеличиваются на единицу, и я понятия не имею, как это сделать автоматически в Excel.Я думаю, что должен быть лучший способ, чем использовать вложенную функцию Excel, поскольку задача (с шагом +1) на самом деле кажется довольно простой.
Я также открыт для решений, включающих sed, awk (из которых у меня только очень поверхностныйзнание) или другие инструменты командной строки.
Ваша помощь очень ценится!

1 Ответ

0 голосов
/ 16 февраля 2019
 awk 'BEGIN { y=1; printf "Name Surname Birthdate\n%s",y; x=1;}
  {if (x == 3) {
   y = y + 1;
   printf "%s\n%s",$2,y;
   x=1;
  }
  else {
   printf " %s ",$2;
   x = x + 1;
  }}' input_file.txt

Это может работать для того, что вы хотите сделать.Ваш образец не включает запятые, поэтому я не уверен, действительно ли они там или нет.Если это так, вам нужно будет немного изменить код с помощью флага -F, чтобы он обрабатывал их как таковые.

Этот второй фрагмент кода предоставит вывод с разделителем-запятой.Опять же, предполагается, что ваш пример входного файла не имел запятых для разделения 1 Джо и 2 Доу.

awk 'BEGIN { y=1; printf "Name Surname Birthdate\n%s",y; x=1;}
 {if (x == 3) {
  y = y + 1;
  printf "%s\n%s,",$2,y;
  x=1;
 }
  else {
  printf " %s,",$2;
  x = x + 1;
 }}' input_file.txt

Оба сценария awk установят переменные x и y равными единице, где переменная yувеличит нумерацию строк.Переменная x будет считать до 3 и затем сбрасывать себя обратно до единицы.Это делается для того, чтобы печатать каждую строку в строке, пока не дойдет до 3-го элемента, где он затем вставит символ новой строки.

Существуют более простые / более сложные способы сделать это с помощью регулярных выражений и такого языка, какperl, но так как вы упомянули awk, я думаю, что это будет хорошо работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...