У меня есть два файла. Один представляет собой структурированные вопросы, а другой — ключ ответа.
SourceQuiz.txt образец:
1)This is the first question.
a) option 1
b) option 2
c) option 3
d) option 4
2)This is the second question
a) option 1
b) option 2
c) option 3
d) option 4
3)This is the third question.
a) option 1
b) option 2
c) option 3
d) option 4
4)This is the fourth question.
a) option 1
b) option 2
c) option 3
d) option 4
etc etc
Образец AnswerKey.txt:
a
b
d
d
Мне нужно, чтобы файл FinalQuiz.txt был в следующем формате: https://docs.moodle.org/311/en/Aiken_format
What is the correct answer to this question?
A. Is it this one?
B. Maybe this answer?
C. Possibly this one?
D. Must be this one!
ANSWER: D
Тот факт, что исходные вопросы имеют ), а не . не имеет значения. Moodle отлично их интерпретирует.
Итак, мне нужно:
- Удалите число и правую скобку в начале каждого вопроса
- Обрезать начальные пробелы в начале вариантов каждого вопроса
- Используйте первую букву каждой строки с заглавной буквы
- затем найдите каждую строку, начинающуюся с D, и вставьте новую строку со строкой
ANSWER: x
, где x — это значение в строке, соответствующей вопросу в AnswerKey.txt
Я знаю, что могу:
Get-Content $SourceQuiz.txt | Foreach {$_.TrimEnd()}
и я знаю, что могу:
Get-Content C:\Users\Administrator\Desktop\123.txt | ForEach-Object {
if ($_) {
$_.Substring(0, 1).ToUpper() + $_.Substring(1)
} else {
$_
}
} > output.txt
И я знаю, что могу использовать if ($_.StarsWIth("D")
в цикле foreach для поиска строк, начинающихся с D.
Чего я не знаю, так это вложения циклов foreach друг в друга, чтобы выполнять их все сразу или в определенном порядке, а также как добавить значение правой строки в AnswerKey.txt (в нашем примере выше Question 1 будет ANSWER: A
, вопрос 2 будет ANSWER: B
, вопрос 3 будет ANSWER: D
, вопрос 4 будет ANSWER D
.
Возможно, я смогу это сделать, если напишу несколько скриптов, но я не уверен. я немного ломал голову над этим.
Редактировать для уточнения. Вот еще раз источник:
1)This is the first question.
a) option 1
b) option 2
c) option 3
d) option 4
2)This is the second question
a) option 1
b) option 2
c) option 3
d) option 4
3)This is the third question.
a) option 1
b) option 2
c) option 3
d) option 4
4)This is the fourth question.
a) option 1
b) option 2
c) option 3
d) option 4
Результат, который я получаю:
This is the first question.
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: D
This is the second question
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: C
This is the third question.
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: A
This is the fourth question.
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: B
Необходимый результат:
1)This is the first question.
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: D
2)This is the second question
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: C
3)This is the third question.
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: A
4)This is the fourth question.
a) option 1
b) option 2
c) option 3
d) option 4
ANSWER: B
Числа отсутствуют. Это индикаторы, которые ищет импортер, чтобы определить конец одного вопроса и начало следующего.
Мне нравится, если это имеет значение +1
@ Даниэль Конечно, это важно для меня. Спасибо Даниэль.
всегда есть только 4 ответа. однако количество вопросов (и соответственно ответов) варьируется
Первый фрагмент кода должен работать нормально, тогда @ScottMcCune
Отлично работает, спасибо @SantiagoSquarzon. Я думаю, что на самом деле я собираюсь использовать второй, на тот случай, если мы столкнемся с аномалией или в будущем будет принято решение, которое изменит масштаб. Можете ли вы объяснить причину -RAW на Get-Content? Почему это важно? Я хочу учиться здесь, а не просто делать работу. Есть ли причина, по которой вы закомментировали (в обоих фрагментах кода) путь\к строкам Get-Content? Предполагая, что я просто удалю #. В конце концов, я просто перехожу к файлу после финального }? то есть '| Вне файла FinalQuiz.txt?
@ScottMcCune смотрите мое последнее редактирование, я сделал все возможное, чтобы объяснить логику, но сам код немного сложен для понимания, если вы только начинаете работать со сценариями или с самим powershell. Пожалуйста, если ответ был полезен, рассмотрите принятие его.
Ценю это @santiago, однако есть одна проблема со сценарием. Как я уже говорил, он обрезает первые два пробела КАЖДОЙ строки, а не только два начальных/пустых пробела перед каждым вариантом вопроса. Он должен обрезать только пробелы в строках, а не в числах и) в вопросах. Тот факт, что цифры отсутствуют, нарушает импорт
@SantiagoSquarzon почему-то вчера не смог отметить тебя с телефона
@ScottMcCune, я не уверен, что вы с последним комментарием, вывод моего кода выглядит почти так же, как ожидаемый вывод из вашего ответа. Если вы хотите отредактировать свой вопрос, показав, что вы получаете в результате, и каким будет ожидаемый результат.
@SantiagoSquarzon отредактировано в соответствии с просьбой. Число и круглые скобки отсутствуют в начале каждого вопроса в выходных данных. Я не хочу удалять первые 2 символа из каждой строки, я хочу только удалить пустые пробелы в начале каждой строки.
@ScottMcCune Если вы хотите этого, вам просто нужно изменить
$sourceQuiz -split '\d+\)' -ne ''
на$sourceQuiz -split '(?=\d+\))' -ne ''
, однако параметры отображаются также с символом, за которым следует)
, когда вы заявили, что хотите использовать символ с заглавной буквы и изменить)
для.
Да, я извиняюсь @SantiagoSquarzon, инструкции по импортеру были неясными, и я сделал предположение, основанное на его примере. Первый критерий, который я перечислил
Strip the number and right parenthesis from the beginning of each question
, был неверным. На самом деле мне нужно сохранить число и круглые скобки в первой строке, но мне нужно удалить начальные пробелы в других строках.@SantiagoSquarzon Я смог сделать это легко, добавив '(?=\d))', как вы указали выше, но отслеживая ошибку немного дальше, я обнаружил, что мне также нужно добавить пробел после каждого числа и скобки. Итак, я провел некоторое исследование и обнаружил, что ?= — это просмотр вперед, а \d определяет, что мы ищем цифру, а не слово или любой другой символ, и я смог вставить пробел перед это, но я не могу понять, как вставить пробел после ) перед первым символом следующего слова.
@SantiagoSquarzon, неважно. Я понял. это было не то. импортер выдал ошибку, потому что исходящий файл сохранялся как UTF-16 LE, а импортеру требуется UTF-8. Я добавил
-Encoding "UTF8"
в командлет Out-File, и он отлично работает. извините, что такая ворчливая, но большое спасибо. Я узнал совсем немного.