World number ones South Africa, who are eliminated, suffered three run-outs in a collapse of eight wickets for 51 runs to be bowled out for 191.
Shikhar Dhawan made 78 and Virat Kohli 76 not out as India raced to their target with 12 overs to spare.
India join England and Bangladesh in the last four, with Sri Lanka meeting Pakistan on Monday for the final spot.
It would take a dramatic swing in net run-rate for India to be toppled as Group B leaders, so they are likely to play Bangladesh at Edgbaston on Thursday. England are already guaranteed to play in the first semi in Cardiff on Wednesday.
Though South Africa are eliminated, they remain in England for three Twenty20 internationals, followed by a four-Test series.